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.