Pochopenie metódy getBean () na jar

1. Úvod

V tomto výučbe si ukážeme rôzne varianty BeanFactory.getBean () metóda.

Jednoducho povedané, ako to naznačuje aj názov metódy, totoje zodpovedný za načítanie inštancie fazule z kontajnera Spring.

2. Nastavenie jarných bôbov

Najskôr si definujeme niekoľko jarných bôbov na testovanie. Existuje niekoľko spôsobov, ako môžeme poskytnúť definície fazule pre kontajner Spring, ale v našom príklade použijeme konfiguráciu Java založenú na anotáciách:

@Configuration class AnnotationConfig {@Bean (name = {"tiger", "kitty"}) @Scope (value = "prototype") Tiger getTiger (názov reťazca) {return new Tiger (name); } @Bean (name = "lev") Lion getLion () {návrat nového leva ("Napevno napísané meno leva"); } rozhranie Zviera {}} 

Vytvorili sme dve fazule. Lev má predvolený rozsah singleton. Tiger je výslovne nastavený na rozsah prototypu. Ďalej si uvedomte, že sme definovali názvy pre každý fazuľa, ktoré budeme používať v ďalších požiadavkách.

3. The getBean () API

BeanFactory poskytuje päť rôznych podpisov getBean () metóda, ktorú preskúmame v nasledujúcich pododdieloch.

3.1. Získanie fazule podľa mena

Pozrime sa, ako môžeme získať a Lev inštancia fazule pomocou svojho názvu:

Objekt lev = context.getBean ("lev"); assertEquals (Lion.class, lion.getClass ());

V tomto variante poskytneme názov a na oplátku dostaneme inštanciu Objekt triedy, ak v kontexte aplikácie existuje fazuľa s daným menom. V opačnom prípade táto aj všetky ostatné implementácie hádžu NoSuchBeanDefinitionException ak vyhľadávanie fazule zlyhá.

Hlavnou nevýhodou je to po získaní fazule ju musíme nahodiť na požadovaný typ. Môže to spôsobiť ďalšiu výnimku ak má vrátená fazuľa iný typ, ako sme čakali.

Predpokladajme, že sa pokúsime získať a Tiger pomocou názvu „Lev“. Keď výsledok vrhneme na Tiger, bude vrhať a ClassCastException:

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

3.2. Získanie fazule podľa mena a typu

Tu musíme určiť názov aj typ požadovanej fazule:

Lev lev = context.getBean ("lev", Lion.class);

V porovnaní s predchádzajúcou metódou je táto bezpečnejšia, pretože informácie o nesúlade typov získavame okamžite:

assertThrows (BeanNotOfRequiredTypeException.class, () -> context.getBean ("lev", Tiger.class)); }

3.3. Získanie fazule podľa typu

S tretím variantom getBean (), stačí uviesť iba typ fazule:

Lev lev = context.getBean (Lion.class);

V takom prípade musíme osobitnú pozornosť venujte potenciálne nejednoznačnému výsledku:

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

Vo vyššie uvedenom príklade, pretože oboje Lev a Tiger implementovať Zviera rozhranie, iba určenie typu nestačí na jednoznačné určenie výsledku. Preto dostaneme a NoUniqueBeanDefinitionException.

3.4. Získanie fazule podľa mena s parametrami konštruktora

Okrem názvu fazule môžeme odovzdať aj parametre konštruktora:

Tiger tiger = (Tiger) context.getBean ("tiger", "sibírsky");

Táto metóda je trochu iná, pretože sa vzťahuje iba na fazuľa s prototypom rozsahu.

V prípade singletonov dostaneme a BeanDefinitionStoreException.

Pretože prototyp fazule vráti novovytvorenú inštanciu vždy, keď sa požaduje z kontajnera aplikácie, môžeme poskytnúť parametre konštruktora za behu pri vyvolaní getBean ():

Tiger tiger = (Tiger) context.getBean ("tiger", "sibírsky"); Tiger secondTiger = (Tiger) context.getBean ("tiger", "pruhovaný"); assertEquals ("sibírsky", tiger.getName ()); assertEquals ("Striped", secondTiger.getName ());

Ako vidíme, každý Tiger dostane iný názov podľa toho, čo sme zadali ako druhý parameter pri žiadosti o fazuľu.

3.5. Načítanie fazule podľa typu s parametrami konštruktora

Táto metóda je obdobou poslednej metódy, ale ako prvý argument musíme namiesto názvu odovzdať typ:

Tiger tiger = context.getBean (Tiger.class, "Shere Khan"); assertEquals ("Shere Khan", tiger.getName ());

Podobne ako pri načítaní fazule podľa názvu s parametrami konštruktora, táto metóda sa vzťahuje iba na fazuľa s rozsahom prototypu.

4. Úvahy o použití

Napriek tomu, že sú definované v BeanFactory rozhranie, getBean () metóda je najčastejšie prístupná cez internet ApplicationContext. Typicky nechceme používať getBean () metóda priamo v našom programe.

Fazuľa by mala byť spravovaná kontajnerom. Ak chceme použiť jednu z nich, mali by sme sa spoliehať skôr na vkladanie závislostí ako na priame volanie ApplicationContext.getBean (). Takto sa môžeme vyhnúť zmiešaniu aplikačnej logiky s detailmi súvisiacimi s rámcom.

5. Záver

V tomto rýchlom výučbe sme prešli všetkými implementáciami getBean () metóda z BeanFactory rozhranie a popísal výhody a nevýhody každého z nich.

Všetky tu zobrazené príklady kódov sú k dispozícii na GitHub.


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