@Lookup kommentár tavasszal

1. Bemutatkozás

Ebben a gyors bemutatóban megnézzük Spring módszertani szintű függőség-injektálási támogatását a @Nézz fel annotáció.

2. Miért @Nézz fel?

A módszerrel annotált módszer @Nézz fel megadja Springnek, hogy adja vissza a metódus visszatérési típusának egy példányát, amikor meghívjuk.

Lényegében a Spring felülírja az annotált módszerünket, és argumentumként használja a módszerünk visszatérési típusát és paramétereit BeanFactory # getBean.

@Nézz fel hasznos:

  • Prototípusú babot injektálunk egyszemélyes babba (hasonlóan a Szolgáltató)
  • A függőségek eljárási injektálása

Vegye figyelembe azt is @Nézz fel az XML elem Java megfelelője lookup-módszer.

3. Használata @Nézz fel

3.1. A prototípus hatókörű babot egy Singleton babba injektálják

Ha véletlenül úgy döntünk, hogy a tavaszi bab prototípusát választjuk, akkor szinte azonnal szembesülünk azzal a problémával, hogy miként fogják a szingulett tavaszi babunk elérni ezeket a tavaszi bab prototípusokat?

Most, Szolgáltató bizonyára az egyik út @Nézz fel bizonyos szempontból sokoldalúbb.

Először hozzunk létre egy prototípus babot, amelyet később beinjekciózunk egy szingulus babba:

@Component @Scope ("prototípus") nyilvános osztály SchoolNotification {// ... prototípus-hatókörű állapot}

És ha létrehozunk egy szingul babot, amely felhasználja @Nézz fel:

@Component public class StudentServices {// ... tagváltozók stb. @Lookup public SchoolNotification getNotification () {return null; } // ... getterek és beállítók}

Használata @Nézz fel, kaphatunk egy példányt SchoolNotification szinglik babunkon keresztül:

@Test public void whenLookupMethodCalled_thenNewInstanceReturned () {// ... inicializálja a kontextust StudentServices először = this.context.getBean (StudentServices.class); StudentServices second = this.context.getBean (StudentServices.class); assertEquals (első, második); assertNotEquals (első.getNotification (), második.getNotification ()); }

Vegye figyelembe, hogy a StudentServices, elhagytuk a értesítést kapni módszer csonkaként.

A Spring ugyanis felülírja a módszert egy hívással beanFactory.getBean (StudentNotification.class), így üresen hagyhatjuk.

3.2. A függőségek beadása eljárási szempontból

Még mindig erőteljesebb azonban @Nézz fel lehetővé teszi számunkra, hogy eljárásszerűen injektáljunk egy függőséget, amivel nem tudunk mit kezdeni Szolgáltató.

Fokozzuk StudentNotification valamilyen állapottal:

@Component @Scope ("prototípus") nyilvános osztály SchoolNotification {@Autowired Grader grader; privát karakterlánc neve; magángyűjteményi védjegyek; public SchoolNotification (karakterlánc neve) {// ... mezők beállítása} // ... nyilvános karakterlánc addMark (egész szám) {this.marks.add (mark); adja vissza ezt: grader.grade (this.marks); }}

Most függ néhány tavaszi kontextustól és egy további kontextustól, amelyet eljárási szempontból megadunk.

Ezután hozzáadhatunk egy módszert a StudentServices amely felveszi és megtartja a hallgatói adatokat:

public absztrakt osztály StudentServices {private Map notes = new HashMap (); @Lookup védett absztrakt SchoolNotification getNotification (karakterlánc neve); public String appendMark (karakterlánc neve, egész szám) {SchoolNotification értesítés = notes.computeIfAbsent (név, létezik -> getNotification (név))); visszatérési értesítés.addMark (jelölés); }} 

Futás közben Spring ugyanúgy megvalósítja a módszert, néhány további trükkel.

Először is vegye figyelembe, hogy ez egy összetett konstruktort hívhat meg, és más tavaszi babot is beadhat, ezáltal kezelhetjük SchoolNotification kicsit jobban hasonlít a Spring-tudatos módszerre.

Ezt megvalósítással teszi getSchoolNotification felhívással beanFactory.getBean (SchoolNotification.class, név).

Másodszor, néha elkészíthetjük a @Nézz fel-annotált módszer absztrakt, mint a fenti példa.

Használata absztrakt egy kicsit szebb, mint egy csonk, de csak akkor tudjuk használni, amikor mi nekomponens-szkennelés vagy @Bab-kezelés a környező bab:

@Test public void whenAbstractGetterMethodInjects_thenNewInstanceReturned () {// ... a kontextus inicializálása StudentServices services = context.getBean (StudentServices.class); assertEquals ("PASS", services.appendMark ("Alex", 89)); assertEquals ("FAIL", services.appendMark ("Bethany", 78)); assertEquals ("PASS", services.appendMark ("Claire", 96)); }

Ezzel a beállítással hozzáadhatjuk a Spring függvényeket, valamint a módszer függőségeket SchoolNotification.

4. Korlátozások

Annak ellenére @Nézz felSokoldalúsága van néhány figyelemre méltó korlátozásnak:

  • @Nézz fel-jegyzetlen módszerek, mint értesítést kapni, konkrétnak kell lennie, ha a környező osztály, mint Diák, alkatrész-beolvasott. Ez azért van, mert az alkatrész szkennelés kihagyja az absztrakt babot.
  • @Nézz fel-a kommentált módszerek egyáltalán nem fognak működni, ha a környező osztály az @Bab-kezelt.

Ilyen körülmények között, ha prototípus babot kell beadnunk egy szingulettbe, megnézhetjük Szolgáltató alternatívaként.

5. Következtetés

Ebben a rövid cikkben megtudtuk, hogyan és mikor kell használni a Spring-et @Nézz fel annotáció, beleértve azt is, hogy miként lehet prototípus-hatókörű babot beinjekciózni az egyes babokba, és hogyan lehet eljárni függőségek injektálására.

Az oktatóanyaghoz használt összes kód megtalálható a Github oldalon.