为什么Spring在从applicationContext.xml加载bean时没有看到@Configuration?

时间:2015-03-04 17:45:53

标签: spring configuration spring-java-config

我有以下applicationContext.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">

    <bean class="com.app.config.AppConfig"></bean>      
</beans>

以下配置类:

package com.app.config;

@Configuration
@ComponentScan("com.app")
public class AppConfig {
    // actual beans definition
    @Bean
    ...

    @Bean
    ...

    @Bean
    ...
}

但是如果我运行应用程序,那么Spring将不会加载AppConfig,因为我在NullPointerExceptions依赖项上获得了@Autowired。所以它就像Spring没有在AppConfig类中加载JavaConfig @Bean定义,而是将类视为一个简单的@Component而不是@Configuration组件,而这些组件又可以包含bean定义。

只有当我在applicationContext.xml中添加<context:component-scan>定义而不是在AppConfig中添加@ComponentScan注释时,一切都有效,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">

    <bean class="com.app.config.AppConfig"></bean>
    <context:component-scan base-package="com.app" />
</beans>

AppConfig变得简单:

package com.app.config;

@Configuration // no more @ComponentScan (it's inside applicationContext.xml)
public class AppConfig {
    // actual beans definition
    @Bean
    ...

    @Bean
    ...

    @Bean
    ...
}

现在,为什么如果AppConfig没有applicationContext.xml,那么从applicationContext.xml加载<context:component-scan> bean时,Spring是否看不到@Configuration注释?

1 个答案:

答案 0 :(得分:3)

我猜你的xml中缺少annotation-config。在appcontext.xml中包含以下内容。这是处理注释所必需的。感谢。

<context:annotation-config/>