因此,我的一個配置類包括(測試/生產)DatabaseConfig類,正確的配置類可以通過活動配置文件選擇。但是,當DatabaseConfig類運行時,它的數據源ivar爲空。彈簧配置在創建bean之前不自動掛接?
我做了調試,我TestingDatabaseConfig的DataSource()方法DatabaseConfig的localContainerEntityManagerFactoryBean前的run()運行。
我想我的問題是,爲什麼沒有這方面的工作,它應該工作,我究竟做錯了什麼?
@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;
}
}
我不知道你是怎麼想的是要幫助。首先,構造函數與我無關,據我所知,它是我的DatbaseConfig類創建的,但在創建bean之前未創建自動裝配。 其次,施工順序是如何我希望,然後希望它。 DatabaseConfig(構造函數運行) - > TestingDatabaseConfig(構造函數運行) - > TestingDatabaseConfig(創建dataSource bean) - > DatabaseConfig(emf bean創建) 問題是我創建我的emf bean時沒有訪問dataSource bean 。 – dustins
@dustins:如果你想把任何初始化代碼放到需要自動裝配字段的bean中,你必須創建一個方法並用'@ PostConstruct'對它進行註釋並在那裏進行初始化。原因很簡單:在構造函數中,所有自動裝配的字段都是'null'。 (當然除了基於構造函數的注入,但這是一個不同的故事)'@ PostConstruct'註釋的方法將被spring__after__注入調用,但__before__ bean將被用在框架中。 –
我明白了,但我沒有 - 並沒有做任何內部的構造函數。我甚至沒有構造函數。我沒有看到如何將@PostConstruct放在任何東西上會有所幫助,我的bean方法已經在構造函數之後運行。我相信我只是不明白你想告訴我什麼。 – dustins