Каков порядок создания компонента Spring Boot и внедрения зависимостей?

Я работал над проектом Spring Boot 1.5. У него был следующий тип конфигурационного класса:

@Configurtion
public class Foo{

 @Autowired
 private DependencyA dependencyA;

 @Bean
 public DependencyA getDependency(){
   return new DependencyAImpl();
  }

}

Это нормально работало в Spring Boot 1.5, но когда я обновился до Spring Boot 2, это больше не работало, приложение не запускалось с исключением «Не найден компонент типа DependencyA». Я подумал, что это могло быть потому, что bean-компонент не был создан, когда Spring пытался внедрить зависимость, и поэтому в качестве «взлома» добавил @Lazy к инъекции dependencyA. Это сработало.

В свете этого, каков порядок выполнения класса конфигурации. Это: A) Сначала создайте bean-компоненты, а затем внедрите зависимости B) Попробуйте создать экземпляр со всеми зависимостями, а затем создайте любые bean-компоненты в конфигурации.


person sharmeenR    schedule 12.03.2019    source источник


Ответы (1)


Интересная находка;

Класс конфигурации также является Spring Bean.

Обычно класс конфигурации сначала сканируется и создается экземпляр. Это должно быть отправной точкой, чтобы узнать о других конфигурациях и bean-компонентах.

Однако вы добавили @Autowire для ввода поля. Как я уже сказал, класс конфигурации - это тоже Spring Bean. Следовательно, Spring сначала необходимо разрешить свои зависимости. И попал в тупик.

Чтобы ответить на ваш вопрос. Первым создается экземпляр класса конфигурации, перед другими компонентами.

person Amit Phaltankar    schedule 12.03.2019