Вступление:
Spring @Primary аннотация используется для предоставления более высокого предпочтения помеченному bean-компоненту, когда существует несколько bean-компонентов одного типа.
Spring, по умолчанию, авто-провода по типу. И поэтому, когда Spring пытается выполнить автоматическое подключение и существует несколько бинов одного типа, мы получим исключение NoUniqueBeanDefinitionException :
1
2
3
4
|
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException : No qualifying bean of type [com.programmergirl.Person] is defined: expected single matching bean but found 2: student, teacher ... |
Чтобы решить эту проблему, мы можем использовать аннотацию Spring @Primary , помечая тем самым один компонент как основной.
В этом уроке мы рассмотрим использование этой аннотации более подробно.
@Primary в классе конфигурации :
Допустим, у нас есть следующий класс конфигурации:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
@Configuration public class UniversityConfig { @Bean @Primary public Person student() { return new Student(); } @Bean public Person teacher() { return new Teacher(); } } |
Бины Teacher и Student наследуются от Person, поэтому мы пометили его как тип возврата для нашего аннотированного метода @Bean .
Тем не менее, обратите внимание, что мы пометили компонент Student как основной компонент с помощью аннотации @Primary . Теперь давайте запустим наше приложение:
1
2
3
4
5
|
AnnotationConfigApplicationContext context = AnnotationConfigApplicationContext(UniversityConfig. class ); Person student = context.getBean(Person. class ); System.out.println(student.getClass()); |
Мы увидим, что объект Student получил предпочтение, когда Spring попытался выполнить автоматическое подключение.
Компонент Spring с @Primary :
Допустим, вместо этого у нас включено сканирование компонентов:
1
2
3
4
|
@Configuration @ComponentScan (basePackages= "com.programmergirl.beans" ) public class UniversityConfig { } |
В таких случаях мы можем напрямую аннотировать наш класс компонентов Spring с помощью @Primary :
01
02
03
04
05
06
07
08
09
10
|
@Primary @Component public class Student implements Person { ... } @Component public class Teacher implements Person { ... } |
Теперь, когда напрямую пытаются внедрить тип Person без @Qualifier , будет добавлен bean-объект Student :
01
02
03
04
05
06
07
08
09
10
11
12
|
@Service public class StudentService { // Student bean is primary and so it'll get injected @Autowired private Person student; public void printStudentDetails() { System.out.println(student.getClass()); ... } } |
Вывод:
В этом кратком руководстве мы рассмотрели использование аннотации @Primary в Spring.
Как следует из названия, мы можем использовать аннотацию @Primary для определения первичной аннотации при наличии нескольких бинов одного типа.
Опубликовано на Java Code Geeks с разрешения Шубхры Шриваставы, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Spring @Primary Annotation Мнения, высказанные участниками Java Code Geeks, являются их собственными. |