Bevezetés a Spring ClassPathXmlApplicationContext-be
1. Áttekintés
A Spring Framework mag egyszerűen kifejezve egy IoC konténer, amelyet a bab kezelésére használnak.
Két alapvető típusú tároló van tavasszal - a Babgyár és az Alkalmazás Kontextus. Az előbbi alapvető funkciókat biztosít, amelyeket itt bemutatunk; az utóbbi az előbbiek szuperhalmaza, és a legszélesebb körben használják.
ApplicationContext egy interfész a org.springframework.context csomagot és számos megvalósítással rendelkezik, és a ClassPathXmlApplicationContext ezek egyike.
Ebben a cikkben a ClassPathXmlApplicationContext.
2. Alapvető használat
2.1. Inicializálja a konténert és kezelje a babot
ClassPathXmlApplicationContext betölthet egy XML konfigurációt egy osztályútról és kezelheti annak babjait:
Nekünk van Diák osztály:
nyilvános osztály Diák {private int no; privát karakterlánc neve; // szabványos kivitelezők, mérőeszközök és beállítók}
Konfiguráljuk a Diák bab be classpathxmlapplicationcontext-example.xml és adja hozzá egy osztályútvonalhoz:
Most már használhatjuk a ClassPathXmlApplicationContext az XML konfiguráció betöltéséhez és a Diák bab:
@Test public void testBasicUsage () {ApplicationContext context = new ClassPathXmlApplicationContext ("classpathxmlapplicationcontext-example.xml"); Diák diák = (Student) context.getBean ("hallgató"); assertThat (hallgató.getNo (), egyenlőTo (15)); assertThat (student.getName (), egyenlőTo ("Tom")); Student sameStudent = context.getBean ("hallgató", Student.osztály); assertThat (sameStudent.getNo (), egyenlőTo (15)); assertThat (sameStudent.getName (), equalTo ("Tom")); }
2.2. Több XML konfiguráció
Néha több XML konfigurációt is szeretnénk használni a Spring tároló inicializálásához. Ebben az esetben egyszerűen hozzá kell adnunk több konfigurációs helyet a ApplicationContext:
ApplicationContext context = új ClassPathXmlApplicationContext ("ctx.xml", "ctx2.xml");
3. További képességek
3.1. Kecsesen állítsa le a tavaszi IoC konténert
Amikor a Spring IoC tárolót használjuk egy webes alkalmazásban, a Spring webalapú ApplicationContext a megvalósítások az alkalmazás leállításakor kecsesen leállítják a tárolót, de ha nem webes környezetben, például önálló asztali alkalmazásban használjuk, akkor magunknak kell regisztrálnunk egy leállító kampót a JVM-nél, hogy megbizonyosodjunk arról, hogy a tavaszi Az IoC-tárolót kecsesen leállítják, és az erőforrások felszabadítására megsemmisítési módszereket hív.
Tegyük hozzá a elpusztítani() módszer a Diák osztály:
public void destr () {System.out.println ("A hallgató (no:" + nem + ") megsemmisül"); }
Mostantól konfigurálhatjuk ezt a módszert diák bab megsemmisítési módszere:
Most regisztrálunk egy leállító kampót:
@Test public void testRegisterShutdownHook () {ConfigurableApplicationContext context = new ClassPathXmlApplicationContext ("classpathxmlapplicationcontext-example.xml"); context.registerShutdownHook (); }
A teszt módszer futtatásakor láthatjuk a elpusztítani() módszert nevezzük.
3.2. Nemzetközivé válás MessageSource
A ApplicationContext interfész kiterjeszti a MessageSource interfész, ezért nemzetközivé teszi a funkcionalitást.
An ApplicationContext tároló automatikusan megkeresi a MessageSource bab inicializálásakor, és a babot úgy kell megnevezni messageSource.
Itt van egy példa a különböző nyelvek használatára a MessageSource:
Először tegyünk hozzá egy párbeszéd könyvtárat osztályosztályba, és adjon hozzá két fájlt a párbeszédablakhoz: dialog_en.properties és dialog_zh_CN.tulajdonságok.
dialog_en.properties:
szia = szia te = köszönöm = köszönöm {0}
dialog_zh_CN.tulajdonságok:
hello = \ u4f60 \ u597d te = \ u4f60 köszönöm = \ u8c22 \ u8c22 {0}
Konfigurálja a messageSource bab be classpathxmlapplicationcontext-internationalization.xml:
párbeszédpanel / párbeszédpanel
Ezután kapjuk meg a különböző nyelvek párbeszédszavait MessageSource:
@Test public void testInternationalization () {MessageSource resources = new ClassPathXmlApplicationContext ("classpathxmlapplicationcontext-internationalization.xml"); Karakterlánc enHello = resources.getMessage ("hello", null, "Default", Locale.ENGLISH); Karakterlánc enYou = resources.getMessage ("te", null, Locale.ENGLISH); Karakterlánc enThanks = resources.getMessage ("köszönöm", új objektum [] {enYou}, Nyelv.HUN); assertThat (enHello, egyenlőTo ("hello")); assertThat (enThanks, equTo ("köszönöm")); Karakterlánc chHello = resources.getMessage ("hello", null, "Default", Locale.SIMPLIFIED_CHINESE); Karakterlánc chYou = resources.getMessage ("te", null, Locale.SIMPLIFIED_CHINESE); Karakterlánc chThanks = resources.getMessage ("köszönöm", új objektum [] {chYou}, területi beállítás.SIMPLIFIED_CHINESE); assertThat (chHello, egyenlőTo ("你好")); assertThat (chThanks, egyenlőTo ("谢谢 你")); }
4. Hivatkozás a ApplicationContext
Néha meg kell szereznünk a ApplicationContext az általa kezelt bab belsejében használhatjuk ApplicationContextAware vagy @Autowired ezt csináld meg. Lássuk, hogyan használja ApplicationContextAware művek:
Nekünk van Tanfolyam osztály névvel:
nyilvános osztály Tanfolyam {private String name; // szabványos kivitelezők, mérőeszközök és beállítók}
Nekünk van Tanár osztály, amely a konténer babjainak megfelelően állítja össze a tanfolyamokat:
nyilvános osztály A tanár megvalósítja az ApplicationContextAware {private ApplicationContext context; privát lista tanfolyamok = new ArrayList (); A @Orride public void setApplicationContext (ApplicationContext applicationContext) dobja a BeansException {this.context = applicationContext; } @PostConstruct public void addCourse () {if (context.containsBean ("math")) {Course math = context.getBean ("math", Course.class); tanfolyamok.add (matematika); } if (context.containsBean ("fizika")) {Course fizika = context.getBean ("fizika", Course.class); tanfolyamok.fölött (fizika); }} // szabványos kivitelezők, mérőeszközök és beállítók}
Konfiguráljuk a tanfolyam bab és a tanár bab be classpathxmlapplicationcontext-example.xml:
Ezután - tesztelje a tanfolyamok ingatlan:
@Test public void testApplicationContextAware () {ApplicationContext context = new ClassPathXmlApplicationContext ("classpathxmlapplicationcontext-example.xml"); Tanár tanár = context.getBean ("tanár", Tanár.osztály); Sorolja fel a tanfolyamokat = teacher.getCourses (); assertThat (kurzusok.méret (), egyenlőTo (1)); assertThat (tanfolyamok.get (0) .getName (), equalTo ("matek")); }
A ApplicationContextAware interfész, a @Autowired a kommentárnak ugyanaz a hatása.
Változtassuk meg a Tanár osztály erre:
nyilvános osztály tanár {@Autowired private ApplicationContext context; privát lista tanfolyamok = new ArrayList (); @PostConstruct public void addCourse () {if (context.containsBean ("math")) {Course math = context.getBean ("math", Course.class); tanfolyamok.add (matematika); } if (context.containsBean ("fizika")) {Course fizika = context.getBean ("fizika", Course.class); tanfolyamok.fölött (fizika); }} // szabványos kivitelezők, mérőeszközök és beállítók}
Ezután futtassa azt a tesztet, láthatjuk, hogy az eredmény ugyanaz.
5. Következtetés
ApplicationContext egy Spring konténer, amely a vállalathoz képest több vállalatspecifikus funkcióval rendelkezik BeanFactory, és a ClassPathXmlApplicationContext az egyik leggyakrabban használt megvalósítás.
Tehát ebben a cikkben bemutattuk a ClassPathXmlApplicationContext, beleértve az alapvető használatát, a leállítás regisztrációját, a nemzetközivé válását és a referencia megszerzését.
Mint mindig, a példa teljes forráskódja elérhető a GitHubon.