Вступление:
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
|
@Configurationpublic 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@Componentpublic class Student implements Person { ...} @Componentpublic class Teacher implements Person { ...} |
Теперь, когда напрямую пытаются внедрить тип Person без @Qualifier , будет добавлен bean-объект Student :
|
01
02
03
04
05
06
07
08
09
10
11
12
|
@Servicepublic 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, являются их собственными. |