java-Spring-如果存在主bean,则不要创建bean
作者:互联网
如果它可以作为主bean生成,是否可以防止创建A类型的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.但是问题在于,当配置文件-a处于活动状态时,AppConfig.java中的参数主机不可用,因此AppConfig中的getA方法将引发异常.
由于类型A的bean已经存在或将要存在(我不确定bean创建的顺序),所以我不希望执行AppConfig中的getA().
(当配置文件-a有效时)
有没有办法做到这一点?
可能的解决方案:
>将@Profile({“!profile-a”})添加到AppConfig中的getA方法的顶部.
>如果检查主机参数是否存在,则添加.
我不想做以上两个,因为我必须在多个地方进行更改.
(还有很多其他的类,例如A和其他参数,例如host)
谢谢
让我知道是否需要澄清.
解决方法:
Spring Boot auto-configuration的Condition annotations是约束bean创建的解决方案.
> @ConditionalOnBean:检查指定的Bean类和/或名称是否已包含在BeanFactory中.
> @ConditionalOnProperty:检查指定的属性是否具有特定值
例:
@Configuration
public class SpecificConfig{
@Bean
@ConditionalOnBean(A.class)
@Primary
public A getOtherA() {
//return a bean of type A
}
}
标签:dependency-injection,spring-profiles,spring-bean,spring,java 来源: https://codeday.me/bug/20191118/2024594.html