Для создания бина в SpringBoot мы используем класс, аннотированный @Component, с некоторыми методами создания бина, аннотированными аннотацией @Bean. Теперь я всегда использовал @Bean следующим образом:
@Bean
public func getSome() {
return someFunc(param1, param2, param3);
}
Теперь то, что я видел в каком-то коде, это:
@Bean
public func getSome(Type1 param1, Type2 param2, Type 3 param3) {
return someFunc(param1, param2, param3);
}
Таким образом, Beans создаются при загрузке контекста SpringBoot. Что меня здесь смущает, так это то, как SpringBoot подберет параметры в бине (второй пример).
Может кто-нибудь, пожалуйста, помогите мне понять это?
PS: Пожалуйста, дайте мне знать, если вопрос не ясен. :)




Spring выполнит стандартный поиск bean-компонентов типов Type1, Type2, Type3 в контексте. Если они не будут найдены, Spring попытается создать новые экземпляры, используя конструктор по умолчанию. Если нет конструктора по умолчанию, запуск завершится ошибкой.
Возможно, есть еще какие-то механики, но основы таковы.
@Bean похож на стереотипы Spring (@Component, @Service, @Controller, @RestController, @Repository и @Configuration).
Когда вы пишете метод с @Bean поверх него, это похоже на использование одного из стереотипов поверх класса с конструктором (с @Autowired), поэтому его зависимости могут быть внедрены через конструктор Spring; поэтому эти параметры должны быть компонентами Spring, чтобы их можно было внедрить в ваш аннотированный метод @Bean.
Spring понимает порядок внедрения через граф зависимостей, который Spring создает и начинает создавать bean-компоненты из классов, которые либо не имеют зависимостей, либо их зависимости были созданы и готовы к внедрению.