You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

原因分析与解决方案

核心原因

  1. @Autowired注解的错误使用
    @Bean方法本身的作用是向Spring容器注册Bean,Spring会自动处理这些方法之间的依赖关系,不需要额外添加@Autowired注解。当你给@Bean方法加上@Autowired后,Spring会将该方法视为配置类自身的依赖注入方法,而非Bean的定义方法,这会干扰Bean的正常注册流程。

  2. 配置类代理逻辑被干扰
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:47:45