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: (эти bean-компоненты будут созданы, только если profile-a активен)

@Configuration
@Profile("profile-a")
public class SpecificConfig{
    @Bean
    @Primary
    public A getOtherA() {
     //return a bean of type A
    }
}

Здесь, когда выбран profile-a, bean-компонент типа A будет получен из SpecificConfig.java. Но проблема в том, что когда profile-a активен, параметр host в AppConfig.java недоступен, и поэтому метод getA в AppConfig выдает исключение.

Поскольку bean-компонент типа A уже существует или будет там (я не уверен в порядке создания bean-компонента), я не хочу, чтобы getA() в AppConfig выполнялся. (когда профиль-а активен)

Есть ли способ добиться этого?

Возможные решения:

  1. Добавьте @Profile({"!profile-a"}) в начало метода getA в AppConfig.

  2. Добавьте проверку if, чтобы увидеть, существует ли параметр хоста.

    Я не хочу делать два вышеперечисленных, так как мне придется измениться в нескольких местах. (Есть куча других bean-компонентов, таких как A и другие параметры, такие как host)

Спасибо

Дайте мне знать, если потребуются какие-либо разъяснения.


person user7    schedule 11.11.2016    source источник
comment
почему бы вам не создать пользовательскую аннотацию   -  person emotionlessbananas    schedule 11.11.2016
comment
Изначально я хотел, чтобы бины для конкретного профиля находились в отдельном файле. Профиль будет обрабатывать события по-разному. (скажем, вместо записи в базу данных он будет писать на диск)   -  person user7    schedule 11.11.2016


Ответы (1)


Условие аннотации к Автоматическая настройка Spring Boot — это решение для ограничения создания bean-компонента.

  • @ConditionalOnBean : проверить, что указанные классы компонентов и/или имена уже содержатся в BeanFactory.
  • @ConditionalOnProperty : проверить, что указанные свойства имеют определенное значение

Пример:

@Configuration
public class SpecificConfig{
   @Bean
   @ConditionalOnBean(A.class)
   @Primary
   public A getOtherA() {
    //return a bean of type A
   }
}
person Beck Yang    schedule 12.11.2016