Úvod do jarného ClassPathXmlApplicationContext

1. Prehľad

Jadro Spring Framework je zjednodušene povedané kontajner IoC používaný na správu fazule.

Na jar existujú dva základné typy kontajnerov - Bean Factory a Application Context. Prvý poskytuje základné funkcionality, ktoré sú tu predstavené; druhý je nadradený prvému a je najrozšírenejší.

ApplicationContext je rozhranie v org.springframework.context balík a má niekoľko implementácií a ClassPathXmlApplicationContext je jedným z nich.

V tomto článku sa zameriame na užitočné funkcie poskytované serverom ClassPathXmlApplicationContext.

2. Základné použitie

2.1. Inicializujte kontajner a spravujte fazuľa

ClassPathXmlApplicationContext môže načítať konfiguráciu XML z cesty triedy a spravovať jej fazuľa:

Máme Študent trieda:

public class Student {private int no; súkromné ​​meno reťazca; // štandardné konštruktory, getre a setre}

Konfigurujeme a Študent fazuľa dovnútra classpathxmlapplicationcontext-example.xml a pridajte ho do triedy:

Teraz môžeme použiť ClassPathXmlApplicationContext načítať konfiguráciu XML a získať Študent fazuľa:

@Test public void testBasicUsage () {ApplicationContext context = new ClassPathXmlApplicationContext ("classpathxmlapplicationcontext-example.xml"); Student student = (Student) context.getBean ("študent"); assertThat (student.getNo (), equalTo (15)); assertThat (student.getName (), equalTo ("Tom")); Študent sameStudent = context.getBean ("študent", Student.class); assertThat (sameStudent.getNo (), equalTo (15)); assertThat (sameStudent.getName (), equalTo ("Tom")); }

2.2. Viaceré konfigurácie XML

Niekedy chceme na inicializáciu kontajnera Spring použiť niekoľko konfigurácií XML. V takom prípade musíme pri konštrukcii súboru jednoducho pridať niekoľko konfiguračných umiestnení ApplicationContext:

ApplicationContext context = nový ClassPathXmlApplicationContext ("ctx.xml", "ctx2.xml");

3. Ďalšie možnosti

3.1. Elegantne vypnite jarný kontajner IoC

Keď používame kontajner Spring IoC vo webovej aplikácii, Spring’s web-based ApplicationContext implementácie elegantne vypnú kontajner, keď je aplikácia vypnutá, ale ak ho používame v inom ako webovom prostredí, napríklad v samostatnej desktopovej aplikácii, musíme si sami zaregistrovať vypínací hák u JVM, aby sme sa uistili, že jar Kontajner IoC je elegantne vypnutý a volá metódy zničenia na uvoľnenie zdrojov.

Pridajme a zničiť () metóda do Študent trieda:

public void destru () {System.out.println ("Student (no:" + no + ") je zničený"); }

Teraz môžeme túto metódu nakonfigurovať ako študent metóda zničenia fazule:

Teraz zaregistrujeme vypínací hák:

@Test public void testRegisterShutdownHook () {ConfigurableApplicationContext context = nový ClassPathXmlApplicationContext ("classpathxmlapplicationcontext-example.xml"); context.registerShutdownHook (); }

Keď spustíme testovaciu metódu, môžeme vidieť zničiť () metóda sa volá.

3.2. Internacionalizácia s MessageSource

The ApplicationContext rozhranie rozširuje MessageSource poskytuje internacionalizačné funkcie.

An ApplicationContext kontajner automaticky vyhľadáva a MessageSource fazuľa pri jej inicializácii a fazuľa musí byť pomenovaná ako messageSource.

Tu je príklad použitia rôznych jazykov s MessageSource:

Najskôr pridajme a dialóg adresár do triedy a pridajte dva súbory do adresára dialóg: dialog_en.properties a dialog_zh_CN.properties.

dialog_en.properties:

ahoj = ahoj ty = ty ďakujem = ďakujem {0}

dialog_zh_CN.properties:

ahoj = \ u4f60 \ u597d vy = \ u4f60 dakujem = \ u8c22 \ u8c22 {0}

Nakonfigurujte messageSource fazuľa dovnútra classpathxmlapplicationcontext-internationalization.xml:

    dialóg / dialóg 

Potom poďme na dialógové slová rôznych jazykov MessageSource:

@Test public void testInternationalization () {MessageSource resources = new ClassPathXmlApplicationContext ("classpathxmlapplicationcontext-internationalization.xml"); Reťazec enHello = resources.getMessage ("hello", null, "Default", Locale.ENGLISH); Reťazec enYou = resources.getMessage ("vy", null, miestne nastavenie.ENGLISH); Reťazec enThanks = resources.getMessage ("vďaka", nový objekt [] {enYou}, miestne.ENGLISH); assertThat (enHello, equalTo ("ahoj")); assertThat (enThanks, equalTo ("ďakujem")); Reťazec chHello = resources.getMessage ("hello", null, "Default", Locale.SIMPLIFIED_CHINESE); Reťazec chYou = resources.getMessage ("vy", null, Locale.SIMPLIFIED_CHINESE); Reťazec chThanks = resources.getMessage ("vďaka", nový objekt [] {chYou}, Locale.SIMPLIFIED_CHINESE); assertThat (chHello, equalTo ("你好")); assertThat (chThanks, equalTo ("谢谢 你")); }

4. Odkaz na ApplicationContext

Niekedy musíme získať referenciu ApplicationContext vo vnútri fazule, ktorú spravujeme, môžeme použiť ApplicationContextAware alebo @Autowired urobiť toto. Pozrime sa, ako sa používa ApplicationContextAware Tvorba:

Máme Samozrejme trieda s menom:

public class Course {private String name; // štandardné konštruktory, getre a setre}

Máme Učiteľ trieda, ktorá zostavuje svoje kurzy podľa fazule kontajnera:

verejná trieda Učiteľ implementuje ApplicationContextAware {súkromný kontext ApplicationContext; private List courses = new ArrayList (); @Override public void setApplicationContext (ApplicationContext applicationContext) hodí BeansException {this.context = applicationContext; } @PostConstruct public void addCourse () {if (context.containsBean ("math")) {Course math = context.getBean ("math", Course.class); kurzy.pridat (matematika); } if (context.containsBean ("fyzika")) {Fyzika kurzu = context.getBean ("fyzika", Course.class); kurzy.pridat (fyzika); }} // štandardné konštruktory, getre a setre}

Poďme nakonfigurovať samozrejme fazuľa a učiteľ fazuľa dovnútra classpathxmlapplicationcontext-example.xml:

Potom - otestujte injekciu kurzov nehnuteľnosť:

@Test public void testApplicationContextAware () {ApplicationContext context = nový ClassPathXmlApplicationContext ("classpathxmlapplicationcontext-example.xml"); Učiteľ učiteľ = context.getBean ("učiteľ", Teacher.class); Zoznam kurzov = teacher.getCourses (); assertThat (courses.size (), equalTo (1)); assertThat (courses.get (0) .getName (), equalTo ("math")); }

Okrem implementácie ApplicationContextAware rozhranie pomocou @Autowired anotácia má rovnaký účinok.

Poďme zmeniť Učiteľ triedy do tohto:

verejná trieda Učiteľ {@Autowired súkromný kontext ApplicationContext; private List courses = new ArrayList (); @PostConstruct public void addCourse () {if (context.containsBean ("math")) {Course math = context.getBean ("math", Course.class); kurzy.pridat (matematika); } if (context.containsBean ("fyzika")) {Fyzika kurzu = context.getBean ("fyzika", Course.class); kurzy.pridat (fyzika); }} // štandardné konštruktory, getre a setre}

Potom spustite tento test, môžeme vidieť, že výsledok je rovnaký.

5. Záver

ApplicationContext je kontajner Spring s viac špecifickými funkciami v porovnaní s BeanFactorya ClassPathXmlApplicationContext je jednou z najčastejšie používaných implementácií.

V tomto článku sme teda predstavili niekoľko aspektov ClassPathXmlApplicationContext, vrátane jeho základného použitia, funkčnosti registrácie vypnutia, internacionalizácie a získania referencie.

Úplný zdrojový kód príkladu je ako vždy k dispozícii na serveri GitHub.


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