A getBean () megértése tavasszal

1. Bemutatkozás

Ebben az oktatóanyagban a BeanFactory.getBean () módszer.

Egyszerűen fogalmazva, ahogy a módszer neve is sugallja: ezfelelős egy babpéldány lekéréséért a Spring tárolóból.

2. A tavaszi bab beállítása

Először határozzunk meg néhány tavaszi babot tesztelés céljából. Számos módon adhatunk babdefiníciókat a Spring tárolóhoz, de a példánkban annotáció alapú Java konfigurációt fogunk használni:

@Configuration class AnnotationConfig {@Bean (név = {"tigris", "cica"}) @Scope (érték = "prototípus") Tiger getTiger (karakterlánc neve) {return new Tiger (név); } @Bean (név = "oroszlán") Oroszlán getLion () {return new Lion ("Hardcoded lion name"); } kezelőfelület Állat {}} 

Hoztunk létre két babot. Oroszlán az alapértelmezett szingulett hatókör. Tigris kifejezetten prototípus hatókörre van beállítva. Ezenkívül kérjük, vegye figyelembe, hogy meghatároztuk az egyes babok nevét, amelyeket a további kérések során használunk.

3. Az getBean () API-k

BeanFactory öt különböző aláírást nyújt a getBean () módszer, amelyet a következő alfejezetekben fogunk megvizsgálni.

3.1. Bab beolvasása név szerint

Lássuk, hogyan lehet lekérni a Oroszlán bab példány a nevét használva:

Objektum oroszlán = context.getBean ("oroszlán"); assertEquals (Oroszlán.osztály, oroszlán.getClass ());

Ebben a változatban megadunk egy nevet, és cserébe kapunk egy példányt Tárgy osztály, ha a megadott nevű bab létezik az alkalmazás kontextusában. Egyébként mind ez, mind az összes többi megvalósítás dob NoSuchBeanDefinitionException ha a babkeresés nem sikerül.

A fő hátrány az, hogy a bab lekérése után a kívánt típusra kell önteni. Ez újabb kivételt eredményezhet ha a visszaküldött babnak más típusa van, mint amire számítottunk.

Tegyük fel, hogy megpróbálunk a Tigris a név használata "oroszlán". Amikor az eredményre vetettük Tigris, akkor dob egy ClassCastException:

assertThrows (ClassCastException.class, () -> {Tiger tiger = (Tiger) context.getBean ("oroszlán");});

3.2. Bean beolvasása név és típus szerint

Itt meg kell adnunk mind a kért bab nevét, mind típusát:

Oroszlánfóka = context.getBean ("oroszlán", Oroszlán.osztály);

Az előző módszerhez képest ez biztonságosabb, mert azonnal megkapjuk az információkat a típusok eltéréséről:

assertThrows (BeanNotOfRequiredTypeException.class, () -> context.getBean ("oroszlán", Tiger.class)); }

3.3. Bab beolvasása típus szerint

A harmadik változatával getBean (), elég csak a bab típusát megadni:

Oroszlán oroszlán = context.getBean (Oroszlán.osztály);

Ebben az esetben meg kell fordítson különös figyelmet a potenciálisan kétértelmű eredményre:

assertThrows (NoUniqueBeanDefinitionException.class, () -> context.getBean (Animal.class)); }

A fenti példában, mert mindkettő Oroszlán és Tigris végre a Állat interfész, pusztán a típus megadása nem elég az eredmény egyértelmű meghatározásához. Ezért kapunk egy NoUniqueBeanDefinitionException.

3.4. Bab beolvasása név szerint a konstruktor paramétereivel

A babnév mellett átadhatunk konstruktor paramétereket is:

Tigris tigris = (tigris) kontextus.getBean ("tigris", "szibériai");

Ez a módszer egy kicsit más, mert csak a prototípus hatókörű babokra vonatkozik.

Egyedülállók esetében a BeanDefinitionStoreException.

Mivel a prototípus bab minden alkalommal visszaad egy újonnan létrehozott példányt, amikor az alkalmazás tárolójából kéri, a konstruktor paramétereit menet közben is megadhatjuk amikor hivatkoznak getBean ():

Tigris tigris = (tigris) kontextus.getBean ("tigris", "szibériai"); Tiger secondTiger = (Tigris) context.getBean ("tigris", "Csíkos"); assertEquals ("szibériai", tiger.getName ()); assertEquals ("Csíkos", secondTiger.getName ());

Mint láthatjuk, mindegyik Tigris más nevet kap attól függően, hogy mi adta meg a második paramétert a bab kérésekor.

3.5. Bean lekérése típus szerint a konstruktor paramétereivel

Ez a módszer analóg az utolsó módszerrel, de első névként a név helyett a típust kell megadnunk:

Tigris tigris = context.getBean (tigrisosztály, "Shere Khan"); assertEquals ("Shere Khan", tiger.getName ());

Hasonló a bab név szerinti lekéréséhez konstruktor paraméterekkel, ez a módszer csak a prototípus hatókörű babokra vonatkozik.

4. Használati szempontok

Annak ellenére, hogy meghatározták a BeanFactory interfész, a getBean () A módszer a leggyakrabban a ApplicationContext. Általában nem akarjuk használni a getBean () módszer közvetlenül a programunkban.

A babot a konténer kezeli. Ha valamelyiket használni akarjuk, akkor a függőség-injektálásra kell hagyatkoznunk, nem pedig a közvetlen hívásra ApplicationContext.getBean (). Így elkerülhetjük az alkalmazáslogika és a keretrendszerhez kapcsolódó részletek keverését.

5. Következtetés

Ebben a gyors bemutatóban végigvizsgáltuk a getBean () módszer a BeanFactory felületen, és leírta mindegyik előnyeit és hátrányait.

Az itt bemutatott összes kódpélda elérhető a GitHubon.


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