Spring Configuration method doesn't create bean

Spring Configuration method doesn't create bean

I have a Spring's @Configuration:

@Configuration
public class MyConfiguration {

    public static class BeanAAA {
    }

    public static class BeanBBB {
        BeanAAA beanA;

        public BeanBBB(BeanAAA beanA) {
            this.beanA = beanA;
        }
    }

    @Autowired
    @Bean
    public BeanAAA createBeanAaa() {
        System.out.println("In createBeanAaa");
        return new BeanAAA();
    }

    @Autowired
    @Bean
    public BeanBBB createBeanBbb(BeanAAA beanA) {
        System.out.println("In createBeanBbb");
        return new BeanBBB(beanA);
    }

}

On the application startup, I see the log from the createBeanAaa method. The log from createBeanBbb is missing due to the NoSuchBeanDefinitionException error:

In createBeanAaa
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'com.test.MyConfiguration#0': 
Unsatisfied dependency expressed through method 'createBeanBbb' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type 'com.test.MyConfiguration.BeanAAA' available: 
expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}" 

How is this possible if the BeanAAA was created just before and should be available to @Autowired. Doesn't this mechanism work if it's injected in the same @Configuration?

Spring ver: 5.2.22.RELEASE

Answer

The issue is a wrong usage of the @Autowired on @Bean methods. The solution is to remove the @Autowired annotations from your @Bean methods:

@Configuration
public class MyConfiguration {
    public static class BeanAAA {
    }

    public static class BeanBBB {
        BeanAAA beanA;

        public BeanBBB(BeanAAA beanA) {
            this.beanA = beanA;
        }
    }

    @Bean
    public BeanAAA createBeanAaa() {
        System.out.println("In createBeanAaa");
        return new BeanAAA();
    }

    @Bean
    public BeanBBB createBeanBbb(BeanAAA beanA) {
        System.out.println("In createBeanBbb");
        return new BeanBBB(beanA);
    }
}

Enjoyed this article?

Check out more content on our blog or follow us on social media.

Browse more articles