@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.