Ú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.