@Lookup-kommentar om foråret

1. Introduktion

I denne hurtige tutorial tager vi et kig på Spring's metode-niveau afhængighedsinjektionsstøtte via @Kig op kommentar.

2. Hvorfor @Kig op?

En metode, der er kommenteret med @Kig op fortæller Spring at returnere en forekomst af metodens returneringstype, når vi påberåber den.

I det væsentlige vil Spring tilsidesætte vores annoterede metode og bruge vores metodes returtype og parametre som argumenter for BeanFactory # getBean.

@Kig op er nyttig til:

  • Injektion af en prototype-scoped bønne i en singleton bønne (svarende til Udbyder)
  • Injicering af afhængigheder procedurelt

Bemærk også det @Kig op er Java-ækvivalent med XML-elementet opslagsmetode.

3. Brug @Kig op

3.1. Injektion af prototype-scoped Bean i en Singleton Bean

Hvis vi tilfældigvis beslutter at have en prototype Spring bønne, står vi næsten øjeblikkeligt over for problemet med, hvordan vil vores singleton Spring beans få adgang til disse prototype Spring beans?

Nu, Udbyder er dog bestemt en måde @Kig op er mere alsidig i nogle henseender.

Lad os først oprette en prototype bønne, som vi senere injicerer i en singleton bønne:

@Component @Scope ("prototype") offentlig klasse SchoolNotification {// ... prototype-scoped state}

Og hvis vi opretter en singletonbønne, der bruger @Kig op:

@Component public class StudentServices {// ... medlemsvariabler osv. @Lookup public SchoolNotification getNotification () {return null; } // ... getters og setters}

Ved brug af @Kig op, vi kan få en forekomst af Skolemeddelelse gennem vores singleton bønne:

@Test offentlig ugyldig nårLookupMethodCalled_thenNewInstanceReturned () {// ... initialiser kontekst StudentServices først = this.context.getBean (StudentServices.class); StudentServices second = this.context.getBean (StudentServices.class); assertEquals (første, anden); assertNotEquals (first.getNotification (), second.getNotification ()); }

Bemærk, at i Studenttjenester, vi forlod getNotification metode som en stub.

Dette skyldes, at Spring tilsidesætter metoden med et kald til beanFactory.getBean (StudentNotification.class), så vi kan lade det være tomt.

3.2. Injektion af afhængigheder procedurelt

Stadig mere kraftfuld er det dog @Kig op giver os mulighed for at injicere en afhængighed procedurelt, noget vi ikke kan gøre med Udbyder.

Lad os forbedre Studentenotifikation med en eller anden tilstand:

@Component @Scope ("prototype") offentlig klasse SchoolNotification {@Autowired Grader grader; privat strengnavn; private indsamlingsmærker; public SchoolNotification (String name) {// ... set fields} // ... getters and setters public String addMark (Integer mark) {this.marks.add (mark); returner this.grader.grade (this.marks); }}

Nu er det afhængigt af en forårssammenhæng og også yderligere sammenhæng, som vi vil give proceduremæssigt.

Vi kan derefter tilføje en metode til Studenttjenester der tager elevdata og vedvarer det:

offentlig abstrakt klasse StudentServices {private Map notes = new HashMap (); @Lookup beskyttet abstrakt SchoolNotification getNotification (strengnavn); public String appendMark (String name, Integer mark) {SchoolNotification notification = notes.computeIfAbsent (name, exist -> getNotification (name))); returneringsmeddelelse.addMark (mark); }} 

Ved kørsel implementerer Spring metoden på samme måde med et par ekstra tricks.

Først skal du bemærke, at det kan kalde en kompleks konstruktør såvel som injicere andre Spring bønner, så vi kan behandle Skolemeddelelse lidt mere som en Spring-bevidst metode.

Det gør det ved at implementere getSchoolNotification med et opkald til beanFactory.getBean (SchoolNotification.class, navn).

For det andet kan vi nogle gange lave @Kig op-annoteret metode abstrakt, som eksemplet ovenfor.

Ved brug af abstrakt er lidt pænere end en stub, men vi kan kun bruge den, når vi gør det ikkekomponent-scanning eller @Bønne-styre den omkringliggende bønne:

@Test offentligt ugyldigt nårAbstraktGetterMethodInjects_thenNewInstanceReturned () {// ... initialiser kontekst StudentServices services = context.getBean (StudentServices.class); assertEquals ("PASS", services.appendMark ("Alex", 89)); assertEquals ("FAIL", services.appendMark ("Bethany", 78)); assertEquals ("PASS", services.appendMark ("Claire", 96)); }

Med denne opsætning kan vi tilføje Spring-afhængigheder såvel som metodeafhængigheder til Skolemeddelelse.

4. Begrænsninger

På trods af @Kig op'S alsidighed, der er et par bemærkelsesværdige begrænsninger:

  • @Kig op-bemærkede metoder, ligesom getNotification, skal være konkret, når den omgivende klasse ligesom Studerende, er komponentscannet. Dette skyldes, at komponentscanning springer abstrakte bønner over.
  • @Kig op-annoterede metoder fungerer slet ikke, når den omgivende klasse er @Bønne-lykkedes.

Under disse omstændigheder, hvis vi har brug for at injicere en prototype bønne i en singleton, kan vi se på Udbyder som et alternativ.

5. Konklusion

I denne hurtige artikel lærte vi, hvordan og hvornår vi skulle bruge Spring's @Kig op kommentar, herunder hvordan man bruger det til at injicere prototype-scoped bønner i singleton bønner, og hvordan man bruger det til at injicere afhængigheder proceduremæssigt.

Al den kode, der bruges til denne vejledning, kan findes på Github.