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.