Статьи

Spring @Primary Annotation

Вступление:

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, являются их собственными.