我正在开发一个具有以下包结构的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?
答案 0 :(得分:3)
如果您只使用配置文件类((CommonConfiguration
等)导入配置类DevConfiguration
,DevProfile
等),那么您可以删除{{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