I have the following applicationContext.xml file:
<?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> And the following config class:
package com.app.config; @Configuration @ComponentScan("com.app") public class AppConfig { // actual beans definition @Bean ... @Bean ... @Bean ... } But if I run the app then Spring will not load the AppConfig cause I get NullPointerExceptions on @Autowired dependencies. So it is like Spring doesn't load the JavaConfig @Bean definitions inside the AppConfig class but treats the class as a simple @Component and not a @Configuration component which can in turn contain bean definitions.
Everything works only when I add the <context:component-scan> definition inside the applicationContext.xml instead of the @ComponentScan annotation inside AppConfig, like this:
<?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> And AppConfig becomes simply:
package com.app.config; @Configuration // no more @ComponentScan (it's inside applicationContext.xml) public class AppConfig { // actual beans definition @Bean ... @Bean ... @Bean ... } Now, why does Spring doesn't see the @Configuration annotation when it loads the AppConfig bean from applicationContext.xml if applicationContext.xml doesn't have <context:component-scan>?