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