Hogyan kell használni a Spring FactoryBean-t?

1. Áttekintés

Kétféle bab van a tavaszi babtartályban: közönséges bab és gyári bab. A Spring az előbbit közvetlenül használja, míg az utóbbiak maguk is előállíthatnak tárgyakat, amelyeket a keret kezel.

És egyszerűen fogalmazva, a megvalósítással gyár babot építhetünk org.springframework.beans.factory.FactoryBean felület.

2. A gyár bab alapjai

2.1. Végrehajtás a FactoryBean

Nézzük meg a FactoryBean interfész először:

nyilvános felület FactoryBean {T getObject () dobja a Kivételt; Osztály getObjectType (); logikai isSingleton (); }

Beszéljük meg a három módszert:

  • getObject () - a gyár által előállított objektumot adja vissza, és ezt az objektumot fogja használni a Spring tároló
  • getObjectType () - visszaadja az objektum típusát FactoryBean termel
  • isSingleton () - jelöli, ha az ezzel előállított objektum FactoryBean egy egyedülálló

Most pedig hajtsunk végre egy példát FactoryBean. Megvalósítjuk a ToolFactory amely olyan típusú tárgyakat állít elő Eszköz:

public class Tool {private int id; // szabványos kivitelezők, mérőeszközök és beállítók}

A ToolFactory maga:

public class ToolFactory megvalósítja a FactoryBean {private int factoryId; private int toolId; @ Nyilvános eszköz felülírása A getObject () dobja a Kivételt {return new Tool (toolId); } @Orride public class getObjectType () {return Tool.class; } @Orride public boolean isSingleton () {return false; } // szabványos beállítók és szerelők}

Mint láthatjuk, a ToolFactory egy FactoryBean, amely képes előállítani Eszköz tárgyakat.

2.2. Használat FactoryBean XML-alapú konfigurációval

Most nézzük meg, hogyan kell használni a mi ToolFactory.

Elkezdjük egy eszköz felépítését XML-alapú konfigurációval - factorybean-spring-ctx.xml:

Ezután tesztelhetjük, hogy a Eszköz az objektumot helyesen adták be:

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

A teszt eredménye azt mutatja, hogy sikerül beadni a ToolFactory tulajdonságokkal, amelyeket a factorybean-spring-ctx.xml.

A teszt eredménye azt is mutatja, hogy a Spring konténer a FactoryBean helyett maga a függőségi injekció.

Bár a Spring konténer a FactoryBean’S getObject () A módszer visszatérési értéke babként használhatja a FactoryBean maga.

A FactoryBean, csak hozzá kell adnia egy „&” szót a bab neve elé.

Próbáljuk meg beszerezni a gyári babot és annak gyárId ingatlan:

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

2.3. Használat FactoryBean Java-alapú konfigurációval

Használat FactoryBean a Java-alapú konfiguráció kissé eltér az XML-alapú konfigurációtól, akkor meg kell hívnia a FactoryBean’S getObject () módszer kifejezetten.

Konvertáljuk az előző alfejezetben szereplő példát Java-alapú konfigurációs példává:

@Configuration public class FactoryBeanAppConfig {@Bean (name = "tool") public ToolFactory toolFactory () {ToolFactory factory = new ToolFactory (); gyár.setFactoryId (7070); gyár.setToolId (2); visszatérő gyár; } @Bean public Tool tool () dobja a Exception {return toolFactory (). GetObject (); }}

Ezután teszteljük, hogy a Eszköz az objektumot helyesen adták be:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (class = FactoryBeanAppConfig.class) public class FactoryBeanJavaConfigTest {@Autowired private Tool tool; @Resource (name = "& tool") privát ToolFactory toolFactory; @Test public void testConstructWorkerByJava () {assertThat (tool.getId (), equalTo (2)); assertThat (toolFactory.getFactoryId (), equalTo (7070)); }}

A teszt eredménye hasonló hatást mutat, mint az előző XML-alapú konfigurációs teszt.

3. Az inicializálás módjai

Néha el kell végeznie néhány műveletet a FactoryBean van beállítva, de a getObject () metódust hívják, mint a tulajdonságok ellenőrzése.

Ezt elérheti a InitializingBean interfész vagy használatával @PostConstruct annotáció.

További részleteket a két megoldás használatáról egy másik cikk ismertetett: Útmutató a logika futtatásához az indításkor tavasszal.

4. AbstractFactoryBean

A tavasz biztosítja a AbstractFactoryBean mint egyszerű sablon szuperosztály FactoryBean megvalósítások. Ezzel az alapkategóriával most kényelmesen megvalósíthatunk egy gyár babot, amely szingletet vagy prototípus objektumot hoz létre.

Végezzük el a SingleToolFactory és a NonSingleToolFactory hogy megmutassa, hogyan kell használni AbstractFactoryBean mind a szingulett, mind a prototípus típusához:

public class SingleToolFactory kiterjeszti az AbstractFactoryBean {private int factoryId; private int toolId; @Orride public class getObjectType () {return Tool.class; } @Orride védett eszköz createInstance () dobja a Kivételt {return new Tool (toolId); } // szabványos beállítók és szerelők}

És most a nem megvalósított megvalósítás:

public class NonSingleToolFactory kiterjeszti az AbstractFactoryBean {private int factoryId; private int toolId; public NonSingleToolFactory () {setSingleton (hamis); } @Orride public class getObjectType () {return Tool.class; } @Orride védett eszköz createInstance () dobja a Kivételt {return new Tool (toolId); } // szabványos beállítók és szerelők}

Ezen kívül a gyári bab XML-konfigurációja:

Most tesztelhetjük, hogy a Munkás az objektumok tulajdonságait a várakozásoknak megfelelően adják be:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (helyek = {"classpath: factorybean-abstract-spring-ctx.xml"}) public class AbstractFactoryBeanTest {@Resource (name = "singleTool") private Tool tool1; @Resource (name = "singleTool") privát eszköz2; @Resource (name = "nonSingleTool") privát eszköz eszköz3; @Resource (name = "nonSingleTool") privát eszköz eszköz4; @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); }}

Mint a tesztekből láthatjuk, a SingleToolFactory egyetlen tárgyat állít elő, és a NonSingleToolFactory prototípus objektumot állít elő.

Ne feledje, hogy nincs szükség az egyes tulajdonságok beállítására SingleToolFactory mert AbstractFactory, a singleton tulajdonság alapértelmezett értéke igaz.

5. Következtetés

Használva FactoryBean jó gyakorlat lehet az összetett konstrukciós logika beágyazása vagy a nagyon konfigurálható objektumok konfigurálása tavasszal.

Tehát ebben a cikkben bemutattuk az alapjainkat FactoryBean, hogyan kell használni mind az XML-alapú, mind a Java-alapú konfigurációban, valamint a FactoryBean, például a FactoryBean és AbstractFactoryBean.

Mint mindig, a teljes forrásnak vége a GitHubon.