我有以下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注释?
答案 0 :(得分:3)
我猜你的xml中缺少annotation-config。在appcontext.xml中包含以下内容。这是处理注释所必需的。感谢。
<context:annotation-config/>