Почему когда использование @Autowired в @Configuration в Spring иногда не удавалось? - PullRequest
0 голосов
/ 15 мая 2019

Я использую Spring Boot с экономным сервером, у меня есть два класса @Configuration с методом генерации двух компонентов, и код выглядит следующим образом:

@Configuration
public class EagleBeanCreator {

    @Bean(destroyMethod = "destroy")
    public EagleRestClient build() {
        EagleRestClient client = new EagleRestClient();
        // some set values code
        return client;
    }
}

И еще один:

@Configuration
public class EagleServiceBuilder {

    @Autowired
    private EagleRestClient eagleProxy;

    @Bean
    public EagleService eagleService() {
        EagleService service = new EagleService();
        System.out.println(eagleProxy);
        service.setEagleProxy(eagleProxy);
        return service;
    }
}

Но когда я запускаю spring-boot: run, он выводит ноль для "System.out.println (eagleProxy);" Почему?

========================= UPDATE ===================== ========

Я знаю, что работает инжектор сеттера или инжектор конструктора.

Ответы [ 5 ]

2 голосов
/ 15 мая 2019

Потому что порядок загрузки EagleBeanCreator и EagleServiceBuilder не является определенным.Вы можете использовать @Order или @ConditionalOnClass, чтобы сначала выполнить инициализацию EagleBeanCreator.

1 голос
/ 15 мая 2019

Вы можете попробовать это.

@Configuration
public class EagleServiceBuilder {

    @Bean
    public EagleService eagleService(EagleRestClient eagleProxy) {
        EagleService service = new EagleService();
        System.out.println(eagleProxy);
        service.setEagleProxy(eagleProxy);
        return service;
    }
}

Я предполагаю, что то, как вы сейчас реализуете, не указывает на зависимость между EagleService и EagleRestClient. Таким образом, ваша текущая реализация приводит к случайному порядку инициализации между двумя bean-компонентами. Модифицированная версия сообщает Spring: «Эй, мой EagleService зависит от EagleRestClient. Пожалуйста, инициализируйте EagleRestClient до EagleService.

0 голосов
/ 15 мая 2019

Добавьте аннотацию @DependsOn ("eagleRestClient") к определению EagleService.

@DependsOn("eagleRestClient")
@Bean
 public EagleService eagleService() {
       EagleService service = new 
       EagleService();
       System.out.println(eagleProxy);
       service.setEagleProxy(eagleProxy);
        return service;
  }

Затем Spring сначала создаст остальных клиентов, а затем службу eagle.

0 голосов
/ 15 мая 2019

Поскольку компонент @Configuration инициализируется в той же фазе жизненного цикла компонента.Я не помню их ясно, но что-то вроде:

Configurations -> Components -> Services

Если бобы находятся в одной фазе, если они зависят друг от друга, вы должны объявить порядок загрузки некоторыми @Conditional или @Order

0 голосов
/ 15 мая 2019

Во-первых, вам нужно получить пружинный контейнер через ApplicationContextAware try

ApplicationContext.getBean(EagleRestClient.class)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...