Spring @ Primary Annotation
1. Überblick
In diesem kurzen Tutorial werden wir die Annotation@Primaryvon Spring diskutieren, die mit Version 3.0 des Frameworks eingeführt wurde.
Einfach ausgedrückt,we use @Primary to give higher preference to a bean when there are multiple beans of the same type.
Beschreiben wir das Problem im Detail.
2. Warum werden@Primary benötigt?
In einigen Fällenwe need to register more than one bean of the same type.
In diesem Beispiel haben wirJohnEmployee() undTonyEmployee() Bohnen vom TypEmployee:
@Configuration
public class Config {
@Bean
public Employee JohnEmployee() {
return new Employee("John");
}
@Bean
public Employee TonyEmployee() {
return new Employee("Tony");
}
}
Spring throws NoUniqueBeanDefinitionException if we try to run the application.
Um auf Beans mit demselben Typ zuzugreifen, verwenden wir normalerweise die Annotation@Qualifier(“beanName”).
Wir wenden es am Injektionspunkt zusammen mit@Autowired an. In unserem Fall wählen wir die Beans in der Konfigurationsphase aus, sodass@Qualifier hier nicht angewendet werden können. Wir können mehr über die Annotation von@Qualifiererfahren, indem wir denlink folgen.
Um dieses Problem zu beheben, bietet Spring die Annotation@Primaryan.
3. Verwenden Sie@Primary mit@Bean
Werfen wir einen Blick auf die Konfigurationsklasse:
@Configuration
public class Config {
@Bean
public Employee JohnEmployee() {
return new Employee("John");
}
@Bean
@Primary
public Employee TonyEmployee() {
return new Employee("Tony");
}
}
Wir markierenTonyEmployee() Bohne mit@Primary. Der Frühling injiziertTonyEmployee() Bohne bevorzugt gegenüberJohnEmployee().
Lassen Sie uns nun den Anwendungskontext starten und dieEmployee-Bohne daraus abrufen:
AnnotationConfigApplicationContext context
= new AnnotationConfigApplicationContext(Config.class);
Employee employee = context.getBean(Employee.class);
System.out.println(employee);
Nachdem wir die Anwendung ausgeführt haben:
Employee{name='Tony'}
From the output, we can see that the TonyEmployee() instance has a preference while autowiring.
4. Verwenden Sie@Primary mit@Component
We can use @Primary directly on the beans. Schauen wir uns das folgende Szenario an:
public interface Manager {
String getManagerName();
}
Wir haben eineManager-Schnittstelle und zwei Unterklassen-Beans,DepartmentManager:
@Component
public class DepartmentManager implements Manager {
@Override
public String getManagerName() {
return "Department manager";
}
}
Und dieGeneralManager Bohne:
@Component
@Primary
public class GeneralManager implements Manager {
@Override
public String getManagerName() {
return "General manager";
}
}
Beide überschreiben diegetManagerName() derManager-Schnittstelle. Beachten Sie auch, dass wir dieGeneralManager bean mit@Primary markieren.
Diesmal@Primary only makes sense when we enable the component scan:
@Configuration
@ComponentScan(basePackages="org.example.primary")
public class Config {
}
Erstellen wir einen Service, um die Abhängigkeitsinjektion zu verwenden und gleichzeitig die richtige Bean zu finden:
@Service
public class ManagerService {
@Autowired
private Manager manager;
public Manager getManager() {
return manager;
}
}
Hier können beide BohnenDepartmentManager und SandGeneralManagerautomatisch verdrahtet werden.
As we marked GeneralManager bean with @Primary, it will be selected for dependency injection:
ManagerService service = context.getBean(ManagerService.class);
Manager manager = service.getManager();
System.out.println(manager.getManagerName());
Die Ausgabe ist “General manager”.
5. Fazit
In diesem Artikel haben wir etwas über die Annotation@Primaryvon Spring erfahren. Anhand der Codebeispiele haben wir die Notwendigkeit und die Anwendungsfälle von@Primary. demonstriert
Wie üblich ist der vollständige Code für diesen Artikel inover on GitHub project verfügbar.