因此,我的一个配置类包括(测试/生产)DatabaseConfig类,并且活动配置文件选择了正确的类。但是当DatabaseConfig类运行时,它的dataSource ivar为null。
我做了一个调试,我的TestingDatabaseConfig的dataSource()方法在DatabaseConfig的localContainerEntityManagerFactoryBean()运行之前运行。
我想我的问题是,为什么这不起作用,它是否有效,以及我做错了什么?
@Configuration
@Profile({"testing-db", "production-db"})
@Import({TestingDatabaseConfig.class, ProductionDatabaseConfig.class})
@EnableTransactionManagement
public class DatabaseConfig
{
@Resource
private DataSource dataSource;
@Bean(name = "entityManager")
public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean()
{
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(this.dataSource);
// other config
return entityManagerFactoryBean;
}
// ... other db related beans stuff ...
}
@Configuration
@Profile("testing-db")
public class TestingDatabaseConfig implements DatabaseConfigInterface
{
@Bean(name="dataSource")
public DataSource dataSource()
{
JDBCDataSource dataSource = new JDBCDataSource();
dataSource.setDatabase("jdbc:hsqldb:mem:testing");
dataSource.setUser("sa");
return dataSource;
}
}
答案 0 :(得分:2)
当然,在调用构造函数之前,它们不会被注入。
使用@PostConstruct。这是一个很好的例子:http://www.mkyong.com/spring/spring-postconstruct-and-predestroy-example/
答案 1 :(得分:0)
好的,所以我第一次必须做错了,但解决办法是让豆子作为参数自动装配,而不是试图将它们作为ivar注入。为了让它发挥作用,我必须改变一个假的差异......
- @Resource
- private DataSource dataSource;
- public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean()
+ public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean(DataSource dataSource)
- entityManagerFactoryBean.setDataSource(this.dataSource);
+ entityManagerFactoryBean.setDataSource(dataSource);
结束了比我试图做的更清洁=)
答案 2 :(得分:0)
似乎事情不仅神奇地起作用!如果您希望配置类自动配置其ivars,则必须正确配置它,或者在这种情况下,让另一个bean进行自动装配。
您需要创建AutowiredAnnotationBeanPostProcessor bean。
@Bean
public AutowiredAnnotationBeanPostProcessor autowiredAnnotationBeanPostProcessor()
{
return new AutowiredAnnotationBeanPostProcessor();
}
或
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />