Lente @ Primaire annotatie

1. Overzicht

In deze korte tutorial bespreken we de lente @Primair annotatie die werd geïntroduceerd met versie 3.0 van het framework.

Simpel gezegd, we gebruiken @Primair om een ​​hogere voorkeur te geven aan een boon als er meerdere bonen van dezelfde soort zijn.

Laten we het probleem in detail beschrijven.

2. Waarom is @Primair Nodig zijn?

In sommige gevallen, we moeten meer dan één boon van hetzelfde type registreren.

In dit voorbeeld hebben we JohnWerknemer () en TonyWerknemer () bonen van de Werknemer type:

@Configuratie openbare klasse Config {@Bean openbare werknemer JohnEmployee () {retourneer nieuwe werknemer ("John"); } @Bean publieke medewerker TonyEmployee () {retourneer nieuwe medewerker ("Tony"); }}

Lente gooit NoUniqueBeanDefinitionException als we proberen de applicatie uit te voeren.

Om toegang te krijgen tot bonen met hetzelfde type dat we meestal gebruiken @Qualifier ("beanName") annotatie.

We brengen het samen op het injectiepunt aan @Autowired. In ons geval selecteren we de bonen dus in de configuratiefase @Kwalificatie kan hier niet worden toegepast. We kunnen er meer over leren @Kwalificatie annotatie door de link te volgen.

Om dit probleem op te lossen biedt Spring de @Primair annotatie.

3. Gebruik @Primair Met @Boon

Laten we eens kijken naar de configuratieklasse:

@Configuratie openbare klasse Config {@Bean openbare werknemer JohnEmployee () {retourneer nieuwe werknemer ("John"); } @Bean @ Primaire publieke medewerker TonyEmployee () {retourneer nieuwe medewerker ("Tony"); }}

We markeren TonyWerknemer () boon met @Primair. De lente zal injecteren TonyWerknemer () boon bij voorkeur boven de JohnWerknemer ().

Laten we nu de toepassingscontext starten en het Werknemer boon ervan:

AnnotationConfigApplicationContext context = nieuwe AnnotationConfigApplicationContext (Config.class); Medewerker medewerker = context.getBean (Employee.class); System.out.println (medewerker);

Nadat we de applicatie hebben uitgevoerd:

Medewerker {name = 'Tony'}

Aan de output kunnen we zien dat de TonyWerknemer () instantie heeft een voorkeur tijdens het automatisch bedraden.

4. Gebruik @Primair Met @Component

We kunnen @Primary rechtstreeks op de bonen gebruiken. Laten we eens kijken naar het volgende scenario:

openbare interface Manager {String getManagerName (); }

We hebben een Manager interface en twee bonen van de subklasse, Afdelingsmanager:

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

En de Algemeen manager Boon:

@Component @Primary openbare klasse GeneralManager implementeert Manager {@Override public String getManagerName () {return "General manager"; }}

Ze overschrijven allebei de getManagerName () van de Manager koppel. Merk ook op dat we de Algemeen manager boon met @Primair.

Deze keer, @Primair heeft alleen zin als we de componentscan inschakelen:

@Configuration @ComponentScan (basePackages = "org.baeldung.primary") openbare klasse Config {}

Laten we een service maken om afhankelijkheidsinjectie te gebruiken bij het vinden van de juiste bean:

@Service openbare klasse ManagerService {@Autowired privé Manager-manager; openbare Manager getManager () {terugkeerbeheerder; }}

Hier, beide bonen Afdelingsmanager en Algemeen manager komen in aanmerking voor automatische bedrading.

Zoals we hebben gemarkeerd Algemeen manager boon met @Primair, wordt het geselecteerd voor afhankelijkheidsinjectie:

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

De output is "Algemeen manager".

5. Conclusie

In dit artikel hebben we geleerd over de lente @Primair annotatie. Met de codevoorbeelden hebben we de behoefte aan en de use-cases van het @Primair.

Zoals gewoonlijk is de volledige code voor dit artikel beschikbaar op het GitHub-project.


$config[zx-auto] not found$config[zx-overlay] not found