При использовании функциональной регистрации бина, есть ли способ сообщить Spring, что ClassA отвечает за создание экземпляра BeanA? - PullRequest
1 голос
/ 13 февраля 2020

Я переключил часть приложения Spring, чтобы использовать функциональные регистрации бинов. Мотивация для переключения обусловлена ​​требованием нескольких экземпляров некоторых bean-компонентов при определенных условиях. Это также оказывается намного более кратким (что совсем не будет очевидно при упрощенных c примерах ниже).

Код, который выглядел так (простой пример):

@Configuration
public class ConfigA {
  @Bean
  public BeanA beanA() {
    return new BeanA();
  }
}

@Service
public class Service1 {
  @Autowired BeanA beanA;
  ...
}

@Service
public class Service2 {
  @Autowired BeanA beanA;
  ...
}

Я изменил класс конфигурации, чтобы он выглядел следующим образом:

@Configuration
public class ConfigA implements ApplicationContextInitializer<GenericApplicationContext> {
  @Override
  public void initialize(GenericApplicationContext context) {
    context.registerBean("beanA", BeanA.class, () -> new BeanA());
  }
}

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что Spring жалуется на то, что бины с автопроводкой не найдены. С исходным кодом Spring мог бы определить, что bean-компонент BeanA был объявлен через ConfigA, и создал бы этот bean-компонент перед инициализацией сервисов.

С новым кодом, я думаю, у Spring нет способа определить, где BeanA bean (s) объявляются, и поэтому он пытается инициализировать сервисы до инициализации BeanA (что приводит к тому, что приложение не запускается).

Я надеялся, что Spring определит приоритеты классов @Configuration над @Service или классы @Controller, но это не так.

Я мог бы аннотировать все сервисы с помощью @DependsOn ("configA"), но есть много сервисов, которые автоматически связывают BeanA (некоторые в другом коде) оснований), поэтому параметр @DependsOn на самом деле не реализован c.

Вопрос: существует ли способ сообщить Spring, что ConfigA отвечает за создание экземпляра BeanA при использовании функциональной регистрации bean-компонента? 1017 *

...