Spring - 如果存在主bean,则不要创建bean

时间:2016-11-11 04:56:50

标签: java spring dependency-injection spring-bean spring-profiles

是否可以防止创建类型为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处于活动状态时)

有没有办法实现这个目标?

可能的解决方案:

  1. 在{em> AppConfig 中将@Profile({"!profile-a"})添加到 getA 方法的顶部。

  2. 如果检查主机参数是否存在,请添加

    我不想做上述两项,因为我必须在多个地方进行更改。 (还有很多其他的bean,如A和其他参数,如host

  3. 由于

    如果需要澄清,请告诉我。

1 个答案:

答案 0 :(得分:3)

Condition annotationsSpring 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
   }
}