Bilješka @Lookup u proljeće

1. Uvod

U ovom brzom vodiču, putem programa Windows, pogledati ćemo podršku za ubrizgavanje ovisnosti na razini metode Spring @Pogledaj bilješka.

2. Zašto @Pogledaj?

Metoda označena s @Pogledaj govori Springu da vrati instancu tipa return metode kada je pozovemo.

U osnovi, Spring će nadjačati našu označenu metodu i koristiti će povratnu vrstu i parametre naše metode kao argumente BeanFactory # getBean.

@Pogledaj je korisno za:

  • Ubrizgavanje graha s prototipom u jednozrno zrno (slično kao Pružatelj usluga)
  • Postupno ubrizgavanje ovisnosti

Primijetite i to @Pogledaj je Java ekvivalent XML elementa metoda pretraživanja.

3. Korištenje @Pogledaj

3.1. Ubrizgavanje graha s prototipom u zrno jednog zrna

Ako se slučajno odlučimo za prototip proljetnog graha, tada se gotovo odmah suočavamo s problemom kako će naš singleton Spring grah pristupiti tim prototipovima Spring Grah?

Sada, Pružatelj usluga je svakako jedan od načina @Pogledaj je u nekim aspektima svestraniji.

Prvo, izradimo prototip graha koji ćemo kasnije ubrizgati u singleton grah:

@Component @Scope ("prototype") javna klasa SchoolNotification {// ... prototype-scoped state}

A ako stvorimo jedan grah koji koristi @Pogledaj:

@Component javna klasa StudentServices {// ... varijable člana itd. @Lookup public SchoolNotification getNotification () {return null; } // ... getteri i postavljači}

Koristeći @Pogledaj, možemo dobiti primjerak Obavijest o školi kroz naš singleton grah:

@Test public void whenLookupMethodCalled_thenNewInstanceReturned () {// ... prvo inicijalizira kontekst StudentServices = this.context.getBean (StudentServices.class); StudentServices second = this.context.getBean (StudentServices.class); assertEquals (prvi, drugi); assertNotEquals (first.getNotification (), second.getNotification ()); }

Imajte na umu da u StudentServices, napustili smo dobiti obavijest metoda kao klica.

To je zato što Spring nadjačava metodu pozivom na beanFactory.getBean (StudentNotification.class), tako da ga možemo ostaviti praznim.

3.2. Proceduralno ubrizgavanje ovisnosti

Ipak je to još moćnije @Pogledaj omogućuje nam da proceduralno ubrizgamo ovisnost, nešto s čime ne možemo Pružatelj usluga.

Poboljšajmo Obavijest učenika s nekom državom:

@Component @Scope ("prototip") javni razred SchoolNotification {@Autowired Grader grader; privatni naziv niza; oznake privatne kolekcije; public SchoolNotification (naziv niza) {// ... set fields} // ... getteri i postavljači public String addMark (oznaka cijelog broja) {this.marks.add (mark); vrati this.grader.grade (this.marks); }}

Sada je to ovisno o nekom proljetnom kontekstu i također dodatnom kontekstu koji ćemo pružiti proceduralno.

Tada možemo dodati metodu u StudentServices koja uzima podatke o studentima i nastavlja ih:

javni sažetak klase StudentServices {private map notes = new HashMap (); @Lookup zaštićeni sažetak SchoolNotification getNotification (naziv niza); javni String appendMark (naziv niza, cjelovita oznaka) {Obavijest SchoolNotification = notes.computeIfAbsent (ime, postoji -> getNotification (ime))); povrat obavijesti.addMark (oznaka); }} 

Za vrijeme izvođenja Spring će primijeniti metodu na isti način, uz nekoliko dodatnih trikova.

Prvo, imajte na umu da može pozvati složeni konstruktor, kao i ubrizgati druge proljetne zrna, što nam omogućuje liječenje Obavijest o školi nešto više poput metode svjesne proljeća.

To čini primjenom getSchoolNotification s pozivom na beanFactory.getBean (SchoolNotification.class, ime).

Drugo, ponekad možemo napraviti @Pogledaj-sažetak anotirane metode, poput gornjeg primjera.

Koristeći sažetak malo je ljepšeg izgleda od škrpine, ali možemo je koristiti samo kad jesmo nemojskeniranje komponenata ili @Grah-upravljati okolni grah:

@Test public void whenAbstractGetterMethodInjects_thenNewInstanceReturned () {// ... inicijaliziraj 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)); }

Ovom postavkom možemo dodati ovisnosti Spring, kao i ovisnosti metode Obavijest o školi.

4. Ograničenja

Bez obzira na @PogledajSvestranost, postoji nekoliko značajnih ograničenja:

  • @Pogledaj-anotirane metode, poput dobiti obavijest, mora biti konkretan kada okolni razred, poput Student, skenira se komponentama. To je zato što skeniranje komponenata preskače sažetak graha.
  • @Pogledaj-anotirane metode uopće neće raditi kad je okolni razred @Grah-upravlja se.

U tim okolnostima, ako trebamo ubrizgati prototip graha u jednotočku, možemo to potražiti Pružatelj usluga kao alternativa.

5. Zaključak

U ovom kratkom članku naučili smo kako i kada koristiti Spring's @Pogledaj napomena, uključujući kako se koristi za ubrizgavanje graha s prototipom u pojedinačne grah i kako se koristi za proceduralno ubrizgavanje ovisnosti.

Sav kôd korišten za ovaj tutorial može se naći na Githubu.