JavaConfig 中定义的 bean 的 NoSuchBeanDefinitionException

NoSuchBeanDefinitionException for bean defined in JavaConfig

我之前在项目中使用 XML 配置,一切正常。

我们正在逐步转向 java 配置,所以现在我正处于混合使用 Java 和 XML 配置的阶段。

问题来了,我的 XML 配置中定义了一个 bean:beanA。

<bean id="beanA" class="BeanA" />

class BeanA 具有对 BeanB 的自动装配依赖性。

class BeanA {
     @Autowired
     BeanB beanB;
}

早些时候,这个 beanB 也在 XML 配置中,并且 运行 正确。

现在,我做了这个更改,但它不再起作用了:

@Configuration
class MyConfig {
    @Bean
    public BeanB beanB() {
        return new BeanB();
    }
}

除了添加 @Configuration@Bean 注释之外,是否还需要做其他我缺少的事情?

我收到以下错误:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'beanB': Unsatisfied dependency expressed through field 'beanA';

nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.xxxxxx.yyy.zzzzzzzzzzzz.abc.beanA' available:

expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

请注意,

  1. 我只移动了要通过 java 配置创建的 beanB。

  2. BeanA 实际上有更多的依赖,所以我不能在这个阶段将它移动到 java 配置(稍后将进行适当的迁移)。

您还需要在 xml 配置中添加 BeanB 的配置。当程序是 运行 时,它从 xml 配置文件加载所有 bean 定义。所以看起来配置文件中缺少 BeanB 定义。

Spring 不会 从用 @Configuration 注释的 类 加载 bean,除非它被 告知 使用此注释查找 类。

要让 spring 查找这些 类,必须在您的 xml 配置中添加以下内容:

<context:component-scan base-package="com.xxxxx.yyy.zzzz">

然后会递归查找并初始化包com.xxxxx.yyy.zzzz中的所有bean。