如何排除一些@Configuration,只在Spring启动时使用@Import导入它们

时间:2017-08-05 23:13:08

标签: java spring spring-boot

我正在开发一个具有以下包结构的spring-boot webapp ..

- com.myname.configs
    - CommonConfiguration.java  
    - DevConfiguration.java  
    - ProdConfiguration.java
    - SomeOtherConfiguration.java
- com.myname.profiles
    - DevProfile.java
    - ProdProfile.java

所有这些类都是@Configuration类,但DevProfile.java和ProdProfile.java也有@Profile和@Import注释。

CommonConfiguration ..

@Configuration  
public class CommonConfiguration {  
    //commmon configs / beans..  
}  

DevConfiguration ..

@Configuration
@Profile("dev")
public class DevConfiguration {

    @Bean
    //dev specific beans..
}

DevProfile ..

@Configuration  
@Import(value = {CommonConfiguration.class, DevConfiguration.class})  
@Profile("dev")  
public class DevProfile {}  

ProdProfile ..

@Configuration
@Import(value = {CommonConfiguration.class, ProdConfiguration.java})
@Profile("prod")
public class ProdProfile {}

出于某种原因,即使使用-Dspring.profile.active = prod,也会创建DevConfiguration的bean。唯一的解决方法是向DevConfiguration.java添加@Profile(“dev”)注释

有没有办法只为@Import注释中的类创建bean?在一个Profile类中管理Imports似乎比将Profile添加到各种Configuration类更合乎逻辑。

我正在寻找一种方法来做@Aaron Digulla在#1中提出的建议How to exclude some @Configuration file in Spring?

3 个答案:

答案 0 :(得分:3)

如果您只使用配置文件类((CommonConfiguration等)导入配置类DevConfigurationDevProfile等),那么您可以删除{{1}来自config-classes 在这种情况下,config-classes中的bean只能通过活动的profile-class创建(现在config-classes和profile-classes都由spring for beans扫描,但@Configuration只影响profile-classes。)

答案 1 :(得分:1)

实际上,在发表评论后不久,我找到了答案。这里Kirby's回答Exclude subpackages from Spring autowiring?

就我而言,我已经在@SpringBootApplication注释之后添加了这个。

@SpringBootApplication
@ComponentScan(basePackages = { "com.myname" },
              excludeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = "com.myname.configs.*"))
public class DemoWebappApplication {...}  

这样,配置文件类与其中的@Imports一起连接。

答案 2 :(得分:0)

您是否尝试过以下链接中的@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})注释(16.2部分)

https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-auto-configuration.html