Разница между @Bean и @Component
@Component: используется непосредственно в классе. Подходит для автоматического сканирования классов с аннотациями (@Component, @Service, @Repository, @Controller) и для ситуаций, когда вы хотите, чтобы Spring сам создал бин из класса.
@Bean: используется на уровне метода в классе с аннотацией @Configuration и указывает, что возвращаемый объект метода должен быть зарегистрирован как бин в контексте.
Используется, когда нужен более детальный контроль над созданием бина
Способы установки связей между бинами
Способы прямого внедрения зависимостей (wiring)
@Bean
public Parrot parrot() {…}
@Bean
public Person person() {
Person person = new Person();
person.setParrot(parrot());
return person;
}
@Bean
public Parrot parrot() {…}
@Bean
public Person person(Parrot parrot) {…}
Dependency Injection
Шаблон проектирования, который позволяет объекту получать свои зависимости от внешнего источника, а не создавать их самостоятельно.
Технология DI состоит в том, что фреймворк присваивает значение определенному полю или параметру.
Аннотация @Autowired
Используется для автоматического внедрения (инъекции) зависимостей в компоненты.
Spring автоматически находит и подставляет нужные бины в зависимости от типа, избавляя разработчика от необходимости вручную управлять зависимостями.
Когда вы помечаете поле, конструктор или сеттер аннотацией @Autowired, Spring пытается автоматически найти подходящий бин в контексте и внедрить его.
Если Бинов несколько, возникнет конфликт, который можно разрешить с помощью @Qualifier или @Primary.
Способы применения @Autowired
@Component
public class Person {
@Autowired
private Parrot parrot;
}
При таком способе внедрения зависимости поле нельзя отметить как final.
Берегись циклической зависимости!
Proxy
Объекты, коммуницирующие с чем-то, что находится за пределами приложения