Spring配置类@Bean方法依赖注入异常:已创建Bean仍无法被注入
问题:Spring配置类中@Bean方法依赖注入失败
定义如下Spring配置类:
@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); } }
应用启动时,仅能看到createBeanAaa方法的日志,createBeanBbb的日志未出现,且抛出如下异常:
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: {}"
明明BeanAAA已经被创建,为何createBeanBbb无法注入该Bean?同一配置类中的依赖注入机制是否不生效?(Spring版本:5.2.22.RELEASE)
原因分析与解决方案
核心原因
@Autowired注解的错误使用
@Bean方法本身的作用是向Spring容器注册Bean,Spring会自动处理这些方法之间的依赖关系,不需要额外添加@Autowired注解。当你给@Bean方法加上@Autowired后,Spring会将该方法视为配置类自身的依赖注入方法,而非Bean的定义方法,这会干扰Bean的正常注册流程。配置类代理逻辑被干扰
Spring的@Configuration类默认会被CGLIB代理,以此保证Bean的单例性和方法间调用的正确性。但错误添加的@Autowired会破坏这个代理逻辑,导致BeanAAA虽然执行了创建代码,却没有被正确注册到Spring容器中,后续createBeanBbb自然无法找到对应的Bean实例。
解决方案
直接移除两个@Bean方法上的@Autowired注解即可:
@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); } }
修改后,Spring会自动识别createBeanBbb的参数依赖,优先创建BeanAAA并注入到createBeanBbb中,启动时两个日志都会正常打印,异常也会消失。
内容的提问来源于stack exchange,提问作者zolv
相关产品推荐
相关产品推荐

