是否可以防止创建类型为A
的bean,如果它可以作为主bean生成
示例:
我有两个配置类,有两个配置文件。
AppConfig.java:(包含所有bean的通用配置类)
@Configuration
public class AppConfig {
@Value("${host}")
private String host;
@Bean
public A getA() {
//uses the 'host' value to create an object of type A
// Involves database connections
}
@Bean
public B getB(A a) { //Others using bean A. This might come from either getA() or getOtherA()
...
}
}
SpecificConfig.java:(仅当profile-a
处于活动状态时才会创建这些bean)
@Configuration
@Profile("profile-a")
public class SpecificConfig{
@Bean
@Primary
public A getOtherA() {
//return a bean of type A
}
}
此处选择profile-a
时,A
类型的bean将来自SpecificConfig.java
。但问题是当 profile-a 处于活动状态时,AppConfig.java中的参数host
不可用,因此AppConfig中的 getA 方法会引发异常。
由于类型A的bean已经存在或将存在(我不确定bean创建的顺序),我不希望执行AppConfig中的getA()。 (当profile-a处于活动状态时)
有没有办法实现这个目标?
可能的解决方案:
在{em> AppConfig 中将@Profile({"!profile-a"})
添加到 getA 方法的顶部。
如果检查主机参数是否存在,请添加。
我不想做上述两项,因为我必须在多个地方进行更改。
(还有很多其他的bean,如A
和其他参数,如host
)
由于
如果需要澄清,请告诉我。
答案 0 :(得分:3)
Condition annotations的Spring Boot auto-configuration是限制bean创建的解决方案。
@ConditionalOnBean
:检查指定的bean类和/或名称是否已包含在BeanFactory中。 @ConditionalOnProperty
:检查指定的属性是否具有特定值示例:
@Configuration
public class SpecificConfig{
@Bean
@ConditionalOnBean(A.class)
@Primary
public A getOtherA() {
//return a bean of type A
}
}