2017-06-13 308 views
2

有沒有一種方法可以包含基於配置文件的自動配置? (這將是很好,如果有spring.autonfigure.include彈簧引導自動配置包括

我想連接到一個h2數據庫進行測試和本地開發。爲了便於開發,我希望DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.classDataSourceTransactionManagerAutoConfiguration.class自動配置。但是,我希望能夠輕鬆切換到在應用程序服務器中定義並在Configuration類中配置的Oracle數據庫。當切換到Oracle數據庫,我需要排除上述自動配置類:

// This only works for the oracle database - need to include autoconfig 
// classes for h2 database 
@SpringBootApplication(
    exclude = { 
     DataSourceAutoConfiguration.class, 
     HibernateJpaAutoConfiguration.class, 
     DataSourceTransactionManagerAutoConfiguration.class }, 
    scanBasePackages = { 
     "foo.bar" 
    }) 

我有一個「H2」配置文件配置H2數據庫和其他幾個配置文件中,我想活數據庫(本地,開發,測試,質量,產品)。我可以在每個實時數據庫配置文件上使用spring.autoconfigure.exclude屬性,但有時我想在本地「實時」和h2數據庫之間切換。我也可以弄清楚被排除的自動配置類正在做什麼,並在「h2」配置文件中手動配置,但我寧願不重複努力。

任何人都有如何完成這個想法?

+0

您是否嘗試過分離@ @ SpringBootApplication'並使用'@ Profile'註釋了特定配置?你知道只要改變'spring.datasource.url'應該做你需要的嗎? – chrylis

+0

爲什麼在連接到oracle時需要禁用自動配置?只需提供一個'application-prod.properties'並在那裏配置Oracle數據源。另外,如果您提供自己的實例,則不需要排除自動配置,Spring Boot足夠智能以檢測「DataSource」的存在並對其執行操作。但正如所說的,只是創建一個不同的'application.properties',並讓spring啓動根據配置文件決定加載哪一個。 –

+0

我能夠分離'@ SpringBootApplication'並使其正常工作。應用程序服務器(JBoss)配置數據源,因此我必須通過配置類來配置數據源。我需要禁用事務管理,因爲我需要在連接到oracle時使用JBoss。 – greggnic

回答

0

我能夠通過拆分@SpringBootApplication註釋和提供具體的@EnableAutoConfiguration註釋來獲得此功能。

@Configuration 
@ComponentScan(basePackages = {"foo.bar"}) 
@EnableTransactionManagement 
@EnableConfigurationProperties 
public class App extends SpringBootServletInitializer { 
    public static void main(String... args) throws Exception { 
     SpringApplication.run(App.class, args); 
    } 
} 

對於H2數據庫,我啓用「H2」的個人資料,並使用這個類:

@Profile("h2") 
@Configuration 
@EnableAutoConfiguration 
public class H2Config { 
    @Bean 
    public ServletRegistrationBean h2servletRegistration() { 
     ServletRegistrationBean registration = new ServletRegistrationBean(new WebServlet()); 
     registration.addUrlMappings("/console/*"); 
     return registration; 
    } 
} 

,併爲「活的」 Oracle數據庫,我禁用「H2」的個人資料,並使用此等級:

@Profile("!h2") 
@Configuration 
@EnableAutoConfiguration(exclude = { 
     DataSourceAutoConfiguration.class, 
     HibernateJpaAutoConfiguration.class, 
     DataSourceTransactionManagerAutoConfiguration.class }) 
public class NonH2Config { 

}