Uvod u Spring ClassPathXmlApplicationContext

1. Pregled

Jezgra Spring Framework-a je, jednostavno rečeno, IoC spremnik koji se koristi za upravljanje grahom.

Dvije su osnovne vrste spremnika u proljeće - Tvornica graha i Aplikacijski kontekst. Prvi pruža osnovne funkcionalnosti koje su ovdje predstavljene; potonji je superset prvog i najčešće se koristi.

ApplicationContext je sučelje u org.springframework.context paket i ima nekoliko implementacija, a ClassPathXmlApplicationContext je jedan od tih.

U ovom ćemo se članku usredotočiti na korisne funkcionalnosti koje pruža ClassPathXmlApplicationContext.

2. Osnovna upotreba

2.1. Inicijalizirajte spremnik i upravljajte grahom

ClassPathXmlApplicationContext može učitati XML konfiguraciju iz staze za klase i upravljati njezinim grahom:

Imamo Student razred:

javni razred Student {private int no; privatni naziv niza; // standardni konstruktori, getteri i postavljači}

Konfiguriramo a Student grah u classpathxmlapplicationcontext-example.xml i dodajte ga u put predavanja:

Sada možemo koristiti ClassPathXmlApplicationContext učitati XML konfiguraciju i dobiti Student grah:

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

2.2. Više XML konfiguracija

Ponekad želimo koristiti nekoliko XML konfiguracija za inicijalizaciju Spring spremnika. U tom slučaju, jednostavno moramo dodati nekoliko lokacija za konfiguraciju prilikom izrade ApplicationContext:

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

3. Dodatne mogućnosti

3.1. Graciozno zatvorite proljetni IoC kontejner

Kada u web aplikaciji koristimo Spring IoC spremnik, Springov web ApplicationContext implementacije će elegantno isključiti spremnik kad se aplikacija isključi, ali ako ga koristimo u ne-web okruženju, poput samostalne radne površine, moramo sami registrirati kuku za isključivanje s JVM-om kako bismo bili sigurni da je Spring IoC spremnik elegantno se zatvara i poziva metode uništavanja kako bi oslobodio resurse.

Dodajmo a uništiti() metoda za Student razred:

javna prazna uništiti () {System.out.println ("Student (ne:" + no + ") je uništen"); }

Sada ovu metodu možemo konfigurirati kao student metoda uništavanja graha:

Sada ćemo registrirati isključenje:

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

Kada pokrenemo metodu ispitivanja, možemo vidjeti uništiti() metoda se naziva.

3.2. Internacionalizacija sa MessageSource

The ApplicationContext sučelje proširuje MessageSource sučelje, stoga pruža funkcionalnost internacionalizacije.

An ApplicationContext spremnik automatski traži a MessageSource bean u njegovoj inicijalizaciji, a grah mora biti imenovan kao messageSource.

Evo primjera upotrebe različitih jezika s MessageSource:

Prvo, dodajte a dijalog direktorij u put predavanja i dodajte dvije datoteke u direktorij dijaloga: dialog_en.svojstva i dialog_zh_CN.properties.

dialog_en.svojstva:

pozdrav = zdravo ti = hvala = hvala {0}

dialog_zh_CN.properties:

pozdrav = \ u4f60 \ u597d vi = \ u4f60 hvala = \ u8c22 \ u8c22 {0}

Konfigurirajte messageSource grah u classpathxmlapplicationcontext-internacionalizacija.xml:

    dijalog / dijalog 

Zatim, uzmimo dijaloške riječi različitih jezika s MessageSource:

@Test public void testInternationalization () {MessageSource resources = new ClassPathXmlApplicationContext ("classpathxmlapplicationcontext-internationalization.xml"); String enHello = resources.getMessage ("hello", null, "Default", Locale.ENGLISH); String enYou = resources.getMessage ("ti", null, Locale.ENGLISH); String enThanks = resources.getMessage ("hvala", novi objekt [] {enYou}, Locale.ENGLISH); assertThat (enHello, jednakTo ("bok")); assertThat (enThanks, jednakTo ("hvala")); Niz chHello = resources.getMessage ("hello", null, "Default", Locale.SIMPLIFIED_CHINESE); Niz chYou = resources.getMessage ("ti", null, Locale.SIMPLIFIED_CHINESE); String chThanks = resources.getMessage ("hvala", novi objekt [] {chYou}, Locale.SIMPLIFIED_CHINESE); assertThat (chHello, jednakTo ("你好")); assertThat (chThanks, jednakTo ("谢谢 你")); }

4. Referenca na ApplicationContext

Ponekad moramo dobiti referencu na ApplicationContext unutar graha kojim njime upravljamo, možemo koristiti ApplicationContextAware ili @Autowired uraditi ovo. Pogledajmo kako koristiti ApplicationContextAware djela:

Imamo Tečaj razred s imenom:

javni tečaj {privatni naziv niza; // standardni konstruktori, getteri i postavljači}

Imamo Učitelj, nastavnik, profesor klasa koja svoje tečajeve sastavlja prema grahu kontejnera:

nastavnik javne klase implementira ApplicationContextAware {privatni kontekst ApplicationContext; privatni tečajevi s popisa = novi ArrayList (); @Override public void setApplicationContext (ApplicationContext applicationContext) baca BeansException {this.context = applicationContext; } @PostConstruct public void addCourse () {if (context.containsBean ("math")) {Course math = context.getBean ("math", Course.class); tečajevi.dodaj (matematika); } if (context.containsBean ("fizika")) {Fizika predmeta = context.getBean ("fizika", Course.class); tečajevi.dodaj (fizika); }} // standardni konstruktori, getteri i postavljači}

Konfigurirajmo tečaj grah i učitelj, nastavnik, profesor grah u classpathxmlapplicationcontext-example.xml:

Zatim - testirajte injekciju tečajevi svojstvo:

@Test public void testApplicationContextAware () {ApplicationContext context = new ClassPathXmlApplicationContext ("classpathxmlapplicationcontext-example.xml"); Učitelj učitelj = context.getBean ("učitelj", Teacher.class); Navesti tečajeve = teacher.getCourses (); assertThat (courses.size (), jednakTo (1)); assertThat (courses.get (0) .getName (), jednakTo ("math")); }

Osim provedbe ApplicationContextAware sučelje, koristeći @Autowired napomena ima isti učinak.

Promijenimo Učitelj, nastavnik, profesor razred za ovo:

učitelj u javnom razredu {@Autowired private ApplicationContext context; privatni tečajevi s popisa = novi ArrayList (); @PostConstruct public void addCourse () {if (context.containsBean ("math")) {Course math = context.getBean ("math", Course.class); tečajevi.dodaj (matematika); } if (context.containsBean ("fizika")) {Fizika predmeta = context.getBean ("fizika", Course.class); tečajevi.dodaj (fizika); }} // standardni konstruktori, getteri i postavljači}

Zatim pokrenite taj test, možemo vidjeti da je rezultat isti.

5. Zaključak

ApplicationContext je Spring spremnik s više funkcionalnosti specifičnih za poduzeće u usporedbi s BeanFactory, i ClassPathXmlApplicationContext je jedna od njegovih najčešće korištenih implementacija.

Tako smo u ovom članku predstavili nekoliko aspekata ClassPathXmlApplicationContext, uključujući osnovnu upotrebu, funkcionalnost registracije isključenja, funkcionalnost internacionalizacije i dobivanje reference.

Kao i uvijek, cjeloviti izvorni kod za primjer dostupan je na GitHub-u.