@Lookup Anotácia na jar

1. Úvod

V tomto rýchlom výučbe sa pozrieme na jarnú podporu vkladania závislostí na úrovni metód cez @Vyhľadať anotácia.

2. Prečo @Vyhľadať?

Metóda s poznámkou @Vyhľadať povie Springovi, aby vrátil inštanciu návratového typu metódy, keď ju vyvoláme.

Jar v podstate prepíše našu anotovanú metódu a použije ako argumenty návratový typ a parametre našej metódy BeanFactory # getBean.

@Vyhľadať je užitočné pre:

  • Vstreknutie fazule s prototypom do jedinej fazule (podobne ako v prípade Poskytovateľ)
  • Procesné vkladanie závislostí

Všimnite si tiež, že @Vyhľadať je ekvivalent Java prvku XML metóda vyhľadávania.

3. Používanie @Vyhľadať

3.1. Injekcia prototypu s rozsahom Bean do Singleton Bean

Ak sa náhodou rozhodneme mať prototyp jarnej fazule, takmer okamžite sa stretneme s problémom, ako bude mať naše jednolôžkové jarné bôby prístup k týmto prototypom jarných bôbov?

Teraz, Poskytovateľ je však určite jeden spôsob @Vyhľadať je v niektorých ohľadoch všestrannejšia.

Najskôr si vytvorme prototyp fazule, ktorú neskôr vpichneme do singleton fazule:

@Component @Scope ("prototyp") verejná trieda SchoolNotification {// ... stav prototypu}

A ak vytvoríme singletonovú fazuľu, ktorá použije @Vyhľadať:

@ Komponenta verejná trieda StudentServices {// ... členské premenné atď. @Lookup public SchoolNotification getNotification () {return null; } // ... zakladatelia a zakladatelia}

Použitím @Vyhľadať, môžeme získať inštanciu Oznámenie školy prostredníctvom nášho singleton bean:

@Test public void whenLookupMethodCalled_thenNewInstanceReturned () {// ... najskôr inicializovať kontext StudentServices = this.context.getBean (StudentServices.class); StudentServices second = this.context.getBean (StudentServices.class); assertEquals (prvý, druhý); assertNotEquals (first.getNotification (), second.getNotification ()); }

Všimnite si, že v Študentské služby, opustili sme getNotification metóda ako pahýľ.

Je to tak preto, lebo Spring prepíše metódu volaním beanFactory.getBean (StudentNotification.class), aby sme to mohli nechať prázdne.

3.2. Vkladanie závislostí procedurálne

Stále je to však ešte silnejšie @Vyhľadať nám umožňuje procedurálne vložiť závislosť, s čím nemôžeme robiť Poskytovateľ.

Poďme vylepšiť Oznámenie študenta s nejakým stavom:

@Component @Scope („prototyp“) verejná trieda SchoolNotification {@Autowired grader grader; súkromné ​​meno reťazca; značky súkromnej zbierky; public SchoolNotification (názov reťazca) {// ... množinové polia} // ... getre a setre verejné reťazec addMark (celé číslo) {this.marks.add (značka); vrátiť this.grader.grade (this.marks); }}

Teraz to závisí od niektorých jarných kontextov a tiež od ďalších kontextov, ktoré procedurálne poskytneme.

Potom môžeme pridať metódu do Študentské služby ktorý berie údaje študentov a pretrváva ich:

verejná abstraktná trieda StudentServices {súkromné ​​poznámky k mape = nový HashMap (); @Lookup chránený abstrakt SchoolNotification getNotification (názov reťazca); public String appendMark (názov reťazca, značka celého čísla) {SchoolNotification notification = notes.computeIfAbsent (meno, existuje -> getNotification (meno))); vrátiť oznámenie.addMark (značka); }} 

Za behu bude Spring implementovať metódu rovnakým spôsobom, s niekoľkými ďalšími trikmi.

Najskôr si všimnite, že môže volať zložitý konštruktér, ako aj injektovať ďalšie jarné bôby, čo nám umožňuje liečiť Oznámenie školy trochu viac ako jarná metóda.

Robí to implementáciou getSchoolNotification s volaním na beanFactory.getBean (SchoolNotification.class, meno).

Po druhé, niekedy môžeme urobiť @Vyhľadať-anotovaná metóda abstrakt, ako vyššie uvedený príklad.

Použitím abstraktné je o niečo krajší vzhľad ako útržok, ale môžeme ho použiť, iba keď nieskenovanie komponentov alebo @Bean-spravovať okolitá fazuľa:

@Test public void whenAbstractGetterMethodInjects_thenNewInstanceReturned () {// ... inicializovať kontext StudentServices services = context.getBean (StudentServices.class); assertEquals ("PASS", services.appendMark ("Alex", 89)); assertEquals ("FAIL", services.appendMark ("Bethany", 78)); assertEquals ("PASS", services.appendMark ("Claire", 96)); }

S týmto nastavením môžeme do Spring add závislostí pridať aj závislosti metód Oznámenie školy.

4. Obmedzenia

Napriek tomu @VyhľadaťVďaka všestrannosti existuje niekoľko významných obmedzení:

  • @Vyhľadať- anotované metódy, ako getNotification, musí byť betónová, keď má okolitá trieda rada Študent, je naskenovaný komponentom. Je to preto, že skenovanie komponentov preskočí abstraktné fazule.
  • @Vyhľadať-komentované metódy nebudú fungovať vôbec, keď bude okolitá trieda @Bean-organizovaný.

Za týchto okolností, ak potrebujeme vstreknúť prototyp fazule do singletonu, môžeme sa pozrieť na Poskytovateľ ako alternatíva.

5. Záver

V tomto rýchlom článku sme sa dozvedeli, ako a kedy používať Spring @Vyhľadať anotácia vrátane toho, ako ju použiť na injekčné podanie fazule s prototypom do fazule singleton a ako ju použiť na procedurálne vstreknutie závislostí.

Všetky kódy použité v tomto výučbe nájdete na serveri Github.


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