Я переключил часть приложения 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 *