Пролет @Primary Анотация

1. Общ преглед

В този бърз урок ще обсъдим анотацията @Primary на Spring, която беше въведена с версия 3.0 на рамката.

Най-просто казано, ние използваме @Primary, за да дадем по-голямо предпочитание на боб, когато има няколко зърна от един и същи тип.

Нека опишем проблема подробно.

2. Защо е необходим @Primary ?

В някои случаи трябва да регистрираме повече от един боб от същия тип .

В този пример имаме JohnEfficiee () и TonyEfficiee () зърна от тип Employee :

@Configuration public class Config { @Bean public Employee JohnEmployee() { return new Employee("John"); } @Bean public Employee TonyEmployee() { return new Employee("Tony"); } }

Spring изхвърля NoUniqueBeanDefinitionException, ако се опитаме да стартираме приложението .

За достъп до зърна със същия тип обикновено използваме анотация @Qualifier (“beanName”) .

Прилагаме го в точката на инжектиране заедно с @Autowired . В нашия случай избираме компонентите на фазата на конфигуриране, така че @Qualifier не може да се приложи тук. Можем да научим повече за анотацията @Qualifier, като следваме връзката.

За да разрешите този проблем, Spring предлага пояснението @Primary .

3. Използвайте @Primary With @Bean

Нека да разгледаме конфигурационния клас:

@Configuration public class Config { @Bean public Employee JohnEmployee() { return new Employee("John"); } @Bean @Primary public Employee TonyEmployee() { return new Employee("Tony"); } }

Отбелязваме TonyEmployee () боб с @Primary . Пролетта ще инжектира боб TonyEfficiee () за предпочитане пред JohnEfficiee () .

Сега нека да стартираме контекста на приложението и да вземем Bean от служителя от него:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class); Employee employee = context.getBean(Employee.class); System.out.println(employee);

След като стартираме приложението:

Employee{name='Tony'}

От изхода можем да видим, че екземплярът TonyEfficiee () има предпочитание при автоматично свързване .

4. Използвайте @Primary с @Component

Можем да използваме @Primary директно върху зърната . Нека да разгледаме следния сценарий:

public interface Manager { String getManagerName(); }

Разполагаме с интерфейс на мениджър и два компонента на подклас, DepartmentManager :

@Component public class DepartmentManager implements Manager { @Override public String getManagerName() { return "Department manager"; } }

И бобът GeneralManager :

@Component @Primary public class GeneralManager implements Manager { @Override public String getManagerName() { return "General manager"; } }

И двамата заменят getManagerName () на интерфейса на мениджъра . Също така, имайте предвид, че отбелязваме GeneralManager боб с @Primary .

Този път @Primary има смисъл само когато активираме сканирането на компонентите :

@Configuration @ComponentScan(basePackages="org.baeldung.primary") public class Config { }

Нека създадем услуга, която да използва инжектиране на зависимости, докато намираме правилния боб:

@Service public class ManagerService { @Autowired private Manager manager; public Manager getManager() { return manager; } }

Тук, както боб DepartmentManager и GeneralManager отговарят на условията за autowiring.

Както отбелязахме GeneralManager боб с @Primary , той ще бъде избран за зависимостта инжекция :

ManagerService service = context.getBean(ManagerService.class); Manager manager = service.getManager(); System.out.println(manager.getManagerName());

Резултатът е „ Генерален мениджър“.

5. Заключение

В тази статия научихме за анотацията @Primary на Spring . С примерите за кодове демонстрирахме необходимостта и случаите на използване на @Primary.

Както обикновено, пълният код за тази статия е достъпен в проекта GitHub.