2016-07-25 12 views
1

In meiner Spring-Anwendung habe ich eine Haupt @Configuration Klasse namens, sagen wir ConfigApplication. Ich habe auch einige profilbasierte Konfigurationsklassen, ConfigDev und ConfigProd. Die Situation wird wieder aufgenommen, wie folgend:Spring Java Config Bean Definition überschreiben

@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; 
    } 
} 

Wenn ich wählen Sie die dataSource Bean Definition zu bewegen, um eine bestimmte Konfiguration zu haben (mit und ohne Verbindungspool zum Beispiel) zwischen meinen Umgebungen, werde ich alle anderen Bohnen Definition duplizieren müssen (entityManagerFactory, transactionManager), weil sie die DataSource-Bean benötigen.

Ich habe versucht, diese Bohne Definition in meiner ConfigProd Klasse außer Kraft zu setzen, aber es scheint von Spring ignoriert werden, bis es bereits die Bean in der Hauptkonfigurations Klasse geladen ist ...
Gibt es eine Möglichkeit, diese umgebungsspezifischen zu erreichen Aufbau? Oder sollte ich das Design dieser Klassen überdenken?

Antwort

0

Schließlich fand ich eine Lösung. Ich habe gerade die Anmerkung @Import(ConfigApplication.class) in meiner ConfigProd Klasse hinzugefügt. Damit wird die DataSource-Bean-Definition wie erwartet überschrieben.

Verwandte Themen