【发布时间】:2016-07-25 10:37:40
【问题描述】:
在我的 Spring 应用程序中,我有一个名为 @Configuration 的主类,比如说,ConfigApplication。我还有一些基于配置文件的配置类,ConfigDev 和 ConfigProd。情况恢复如下:
@Configuration
@ComponentScan("fr.gf.predication.*")
@Import(value = ConfigSecurity.class)
@PropertySource("classpath:configuration/default.properties")
public class ConfigApplication {
@Bean
public JpaTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
entityManagerFactoryBean.setPackagesToScan(MODEL_PACKAGE);
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setJpaProperties(loadHibernateConfiguration());
return entityManagerFactoryBean;
}
}
如果我选择移动 dataSource bean 定义以在我的环境之间进行特定配置(例如有和没有连接池),我将不得不复制所有其他 bean 定义(entityManagerFactory、transactionManager)因为他们需要 dataSource bean。
我试图在我的ConfigProd 类中覆盖这个 bean 定义,但它似乎被 Spring 忽略了,直到它已经在主配置类中加载了 bean...
有没有办法实现这种特定于环境的配置?还是我应该重新考虑这些类的设计?
【问题讨论】: