Spring Boot ignores beans from Java config class using Spring Profile
java, maven, spring, spring-boot, spring-profiles
Solution
I think you need to `@Import` your `@Configuration` class directly or use the `@ComponentScan` annotation. You initial example that uses `ClassPathXmlApplicationContext` will work because the XML processing happens early, and the `<component-scan>` will find your `@Configuration` classes before they are processed.
With the second example `SpringApplication` has already started processing your `@Configuration` classes and the XML is loaded via `@ImportResource`. By this time it is not possible for the XML `<component-scan>` to add more `@Configuration`.
Sort answer: Try `@ComonentScan` on your `BasketHandlerLoader` class.
Problem
When I run my application on Eclipse with a classical context loading, no worries, the beans defines on the config class corresponding with the Spring Profile chosen are correctly instanciated. ``` public class BasketHandlerLoader { public static void main(String[] args) throws Exception { @SuppressWarnings("resource") ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:config/spring/spring-archibald-basket-handler-context.xml"); context.registerShutdownHook(); } } ``` But, when I run the application with Spring Boot, these beans are not instanciated. ``` @Configuration @ImportResource("classpath:config/spring/spring-archibald-basket-handler-context.xml") public class BasketHandlerLoader { public static void main(String[] args) throws Exception { SpringApplication.run(BasketHandlerLoader.class, args); } } ``` Here is the java configuration class for the "dev" Spring profile: ``` @Configuration @Profile("dev") @EnableTransactionManagement @PropertySources(value = { @PropertySource("classpath:filters/dev.properties") }) public class DevPersistenceConfig extends AbstractPersistenceConfig { @Inject private Environment env; @Override @Bean public DataSource dataSource() { return super.createDataSource(env); } @Override public Properties hibernateProperties() { return super.createHibernateProperties(env); } } ``` Here the AbstractPersistenceConfig class containing the others beans not instanciated: ``` public abstract class AbstractPersistenceConfig { // Constants... // ************************** ABSTRACT METHODS ************************** /** * Returns a property list containing the Hibernate properties. * * @return the Hibernate properties. */ public abstract Properties hibernateProperties(); /** * Defines the application datasource bean corresponding with the current Spring Profile. * * @return the application datasource bean corresponding with the current Spring Profile. */ @Bean public abstract DataSource dataSource(); /** * Defines the Hibernate session factory bean. * * @return the {@code LocalSessionFactoryBean}. */ @Bean public LocalSessionFactoryBean sessionFactory() { LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(dataSource()); sessionFactory.setPackagesToScan(new String[] { HIBERNATE_PACKAGE_TO_SCAN }); sessionFactory.setHibernateProperties(hibernateProperties()); return sessionFactory; } /** * Defines the bean allowing to Hibernate to support the transaction handling mechanism. * * @return the {@code HibernateTransactionManager}. */ @Bean public HibernateTransactionManager transactionManager() { HibernateTransactionManager txManager = new HibernateTransactionManager(); txManager.setSessionFactory(sessionFactory().getObject()); return txManager; } // ************************** PROTECTED METHODS ************************** // ... // ************************** PRIVATE METHODS ************************** // ... } ``` I tried to run the application with the following commands with the same result: ``` java -jar archibald-basket-handler-1.0-SNAPSHOT.jar --spring.profiles.active=dev java -jar -Dspring.profiles.active=dev archibald-basket-handler-1.0-SNAPSHOT.jar ``` Concretely, the bean "sessionFactory" is not instanciated and cannot be injected into my GenericDaoImpl class... The stacktrace: ``` java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53) at java.lang.Thread.run(Unknown Source) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'basketDaoImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory fr.ina.archibald.dao.impl.GenericDaoImpl.sessionFactory; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject()} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:648) at org.springframework.boot.SpringApplication.run(SpringApplication.java:311) at org.springframework.boot.SpringApplication.run(SpringApplication.java:909) at org.springframework.boot.SpringApplication.run(SpringApplication.java:898) at fr.ina.archibald.basket.loader.BasketHandlerLoader.main(BasketHandlerLoader.java:30) ... 6 more Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory fr.ina.archibald.dao.impl.GenericDaoImpl.sessionFactory; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject()} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ... 21 more Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject()} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1103) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) ... 23 more ``` I use the Spring Boot 1.0.2.RELEASE without the Spring Boot parent POM. I just defines this on the POM : ``` <dependencyManagement> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${org.springframework.boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencyManagement> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <mainClass>${start-class}</mainClass> </configuration> </plugin> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-integration</artifactId> <version>${org.springframework.boot.version}</version> </dependency> ``` Do you have some ideas? Thanks a lot!!