Ako používať Spring FactoryBean?

1. Prehľad

V nádobe na fazuľu Spring sú dva druhy fazule: obyčajná fazuľa a továrenská fazuľa. Spring používa prvý z nich priamo, zatiaľ čo druhý môže sami vyrábať objekty, ktoré sú spravované rámcom.

A zjednodušene povedané, implementáciou môžeme vybudovať továrenskú fazuľu org.springframework.beans.factory.FactoryBean rozhranie.

2. Základy továrenských bôbov

2.1. Implementovať a FactoryBean

Pozrime sa na FactoryBean najskôr rozhranie:

verejné rozhranie FactoryBean {T getObject () vyvolá výnimku; Trieda getObjectType (); boolean isSingleton (); }

Poďme diskutovať o troch metódach:

  • getObject () - vráti objekt vyrobený vo výrobe, a to je objekt, ktorý bude použitý v kontajneri Spring
  • getObjectType () - vráti typ objektu, ktorý toto FactoryBean vyrába
  • isSingleton () - označuje, či je predmet vyrobený týmto FactoryBean je singleton

Teraz implementujme príklad FactoryBean. Implementujeme ToolFactory ktorý produkuje objekty typu Nástroj:

public class Tool {private int id; // štandardné konštruktory, getre a setre}

The ToolFactory sám:

verejná trieda ToolFactory implementuje FactoryBean {private int factoryId; private int toolId; @ Verejný nástroj Tool getObject () vyvolá výnimku {return new Tool (toolId); } @Override public Class getObjectType () {return Tool.class; } @Override public boolean isSingleton () {return false; } // štandardní zakladatelia a obstarávatelia}

Ako vidíme, ToolFactory je a FactoryBean, ktoré môžu produkovať Nástroj predmety.

2.2. Použite FactoryBean S konfiguráciou založenou na XML

Poďme sa teraz pozrieť na to, ako používať naše ToolFactory.

Začneme konštruovať nástroj s konfiguráciou založenou na XML - factorybean-spring-ctx.xml:

Ďalej môžeme vyskúšať, či Nástroj objekt je vložený správne:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (locations = {"classpath: factorybean-spring-ctx.xml"}) verejná trieda FactoryBeanXmlConfigTest {@Autowired private Tool tool; @Test public void testConstructWorkerByXml () {assertThat (tool.getId (), equalTo (1)); }}

Výsledok testu ukazuje, že sa nám podarilo vstreknúť objekt nástroja vyprodukovaný ToolFactory s vlastnosťami, ktoré sme nakonfigurovali v factorybean-spring-ctx.xml.

Výsledok testu tiež ukazuje, že kontajner Spring používa objekt vyprodukovaný pomocou FactoryBean namiesto seba pre injekciu závislostí.

Aj keď nádoba Spring používa FactoryBean‘S getObject () návratová hodnota metódy ako fazuľa, môžete tiež použiť FactoryBean sám.

Pre prístup k FactoryBean, pred meno fazule stačí pridať „&“.

Skúsme zohnať továrenské zrno a jeho factoryId nehnuteľnosť:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (locations = {"classpath: factorybean-spring-ctx.xml"}) verejná trieda FactoryBeanXmlConfigTest {@Resource (name = "& tool") súkromná ToolFactory toolFactory; @Test public void testConstructWorkerByXml () {assertThat (toolFactory.getFactoryId (), equalTo (9090)); }}

2.3. Použite FactoryBean S konfiguráciou na báze Java

Použite FactoryBean s konfiguráciou založenou na prostredí Java sa trochu líši s konfiguráciou založenou na XML, musíte zavolať na FactoryBean‘S getObject () metóda výslovne.

Prenesme si príklad z predchádzajúcej podsekcie na príklad konfigurácie založený na prostredí Java:

@Configuration verejná trieda FactoryBeanAppConfig {@Bean (name = "tool") public ToolFactory toolFactory () {ToolFactory factory = new ToolFactory (); factory.setFactoryId (7070); factory.setToolId (2); vrátiť továreň; } @Bean public Tool tool () hodí výnimku {return toolFactory (). GetObject (); }}

Potom otestujeme, či Nástroj objekt je vložený správne:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (triedy = FactoryBeanAppConfig.class) verejná trieda FactoryBeanJavaConfigTest {@Autowired súkromný nástroj Tool; @Resource (name = "& tool") private ToolFactory toolFactory; @Test public void testConstructWorkerByJava () {assertThat (tool.getId (), equalTo (2)); assertThat (toolFactory.getFactoryId (), equalTo (7070)); }}

Výsledok testu vykazuje podobný efekt ako predchádzajúci konfiguračný test založený na XML.

3. Spôsoby inicializácie

Niekedy musíte vykonať niektoré operácie po FactoryBean bol stanovený, ale pred getObject () metóda sa volá, ako kontrola vlastností.

Môžete to dosiahnuť implementáciou InitializingBean rozhranie alebo pomocou @PostConstruct anotácia.

Viac podrobností o používaní týchto dvoch riešení bolo predstavených v inom článku: Sprievodca spustením logiky pri štarte na jar.

4. AbstractFactoryBean

Jar poskytuje AbstractFactoryBean ako jednoduchá šablóna nadtriedy pre FactoryBean implementácie. S touto základnou triedou teraz môžeme pohodlnejšie implementovať továrenskú fazuľu, ktorá vytvorí singleton alebo prototyp objektu.

Implementujme a SingleToolFactory a a NonSingleToolFactory ukázať, ako sa používa AbstractFactoryBean pre singleton aj prototyp:

verejná trieda SingleToolFactory rozširuje AbstractFactoryBean {private int factoryId; private int toolId; @ Verzia verejné triedy getObjectType () {návrat Tool.class; } @Override chránený nástroj createInstance () vyvolá výnimku {vrátiť nový nástroj (toolId); } // štandardní zakladatelia a obstarávatelia}

A teraz implementácia nonsingleton:

verejná trieda NonSingleToolFactory rozširuje AbstractFactoryBean {private int factoryId; private int toolId; public NonSingleToolFactory () {setSingleton (false); } @Override public Class getObjectType () {return Tool.class; } @Override chránený nástroj createInstance () vyvolá výnimku {vrátiť nový nástroj (toolId); } // štandardní zakladatelia a obstarávatelia}

Konfigurácia XML pre tieto továrenské fazule:

Teraz môžeme vyskúšať, či Pracovník vlastnosti objektov sú vložené tak, ako očakávame:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (locations = {"classpath: factorybean-abstract-spring-ctx.xml"}) verejná trieda AbstractFactoryBeanTest {@Resource (name = "singleTool") súkromný nástroj Tool1; @Resource (name = "singleTool") private Tool tool2; @Resource (name = "nonSingleTool") súkromný nástroj Tool3; @Resource (name = "nonSingleTool") súkromný nástroj Tool4; @Test public void testSingleToolFactory () {assertThat (tool1.getId (), equalTo (1)); assertTrue (tool1 == tool2); } @Test public void testNonSingleToolFactory () {assertThat (tool3.getId (), equalTo (2)); assertThat (tool4.getId (), equalTo (2)); assertTrue (tool3! = tool4); }}

Ako vidíme z testov, SingleToolFactory produkuje singletonový objekt a NonSingleToolFactory vyrába prototyp objektu.

Upozorňujeme, že nie je potrebné nastavovať vlastnosť singleton SingleToolFactory pretože v AbstractFactory, predvolená hodnota vlastnosti singleton je pravda.

5. Záver

Pomocou a FactoryBean môže byť dobrým zvykom zapuzdriť zložitú konštrukčnú logiku alebo uľahčiť konfiguráciu vysoko konfigurovateľných objektov na jar.

Takže v tomto článku sme predstavili základy toho, ako implementovať náš FactoryBean, ako ho používať v konfigurácii založenej na XML aj na konfigurácii založenej na Jave a v niektorých ďalších rôznych aspektoch FactoryBean, napríklad inicializácia FactoryBean a AbstractFactoryBean.

Ako vždy, celý zdroj je na GitHub.


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