Introduktion til Spring ClassPathXmlApplicationContext

1. Oversigt

Spring Framework-kernen er simpelt sagt en IoC-container, der bruges til at styre bønner.

Der er to grundlæggende typer containere om foråret - Bean Factory og Application Context. Førstnævnte giver grundlæggende funktionaliteter, som introduceres her; sidstnævnte er et supersæt af førstnævnte og bruges mest.

ApplicationContext er en grænseflade i org.springframework.context pakke, og den har flere implementeringer, og ClassPathXmlApplicationContext er en af ​​disse.

I denne artikel vil vi fokusere på de nyttige funktioner leveret af ClassPathXmlApplicationContext.

2. Grundlæggende anvendelse

2.1. Initialiser beholderen og administrer bønner

ClassPathXmlApplicationContext kan indlæse en XML-konfiguration fra en klassesti og administrere dens bønner:

Vi har en Studerende klasse:

offentlig klasse studerende {privat int nr; privat strengnavn; // standardkonstruktører, getters og settere}

Vi konfigurerer en Studerende bønne i classpathxmlapplicationcontext-example.xml og tilføj det til en klassesti:

Nu kan vi bruge ClassPathXmlApplicationContext for at indlæse XML-konfigurationen og hente Studerende bønne:

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

2.2. Flere XML-konfigurationer

Nogle gange vil vi bruge flere XML-konfigurationer til at initialisere en Spring-container. I så fald skal vi blot tilføje flere konfigurationsplaceringer, når vi konstruerer ApplicationContext:

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

3. Yderligere kapaciteter

3.1. Luk Spring IoC Container yndefuldt

Når vi bruger Spring IoC container i en webapplikation, er Spring webbaseret ApplicationContext implementeringer lukker beholderen yndefuldt, når applikationen lukkes, men hvis vi bruger den i et ikke-webmiljø, såsom et enkeltstående desktop-program, skal vi selv registrere en lukningskrog med JVM for at sikre, at foråret IoC-containeren lukkes yndefuldt og kalder destrueringsmetoderne for at frigive ressourcer.

Lad os tilføje en ødelægge() metode til Studerende klasse:

offentlig tomrum ødelægge () {System.out.println ("Studerende (nr:" + nej + ") er ødelagt"); }

Vi kan nu konfigurere denne metode som studerende bønne ødelægge metode:

Vi registrerer nu en nedlukningskrog:

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

Når vi kører testmetoden, kan vi se ødelægge() metode kaldes.

3.2. Internationalisering med MessageSource

Det ApplicationContext interface udvider MessageSource interface giver derfor internationaliseringsfunktionalitet.

En ApplicationContext container søger automatisk efter en MessageSource bønne i initialiseringen, og bønnen skal navngives som messageSource.

Her er et eksempel på brug af forskellige sprog med MessageSource:

Lad os først tilføje en dialog mappe til en klassesti og tilføj to filer til dialogbogen: dialog_en.egenskaber og dialog_zh_CN.egenskaber.

dialog_en.egenskaber:

hej = hej du = tak tak = tak {0}

dialog_zh_CN.egenskaber:

hej = \ u4f60 \ u597d dig = \ u4f60 tak = \ u8c22 \ u8c22 {0}

Konfigurer messageSource bønne i classpathxmlapplicationcontext-internationalization.xml:

    dialog / dialog 

Lad os så få forskellige sprogs dialogord med MessageSource:

@Test offentlig ugyldig testInternationalization () {MessageSource resources = new ClassPathXmlApplicationContext ("classpathxmlapplicationcontext-internationalization.xml"); String enHello = resources.getMessage ("hej", null, "Standard", Locale.ENGLISH); String enYou = resources.getMessage ("dig", null, Locale.ENGLISH); Streng enThanks = resources.getMessage ("tak", nyt objekt [] {enYou}, Locale.ENGLISH); assertThat (enHello, equalTo ("hej")); assertThat (enThanks, equalTo ("tak")); String chHello = resources.getMessage ("hej", null, "Standard", Lokal.SIMPLIFIED_CHINESE); String chYou = resources.getMessage ("dig", null, Locale.SIMPLIFIED_CHINESE); String chThanks = resources.getMessage ("tak", nyt objekt [] {chYou}, landestandard.SIMPLIFIED_CHINESE); assertThat (chHello, equalTo ("你好")); assertThat (chThanks, equalTo ("谢谢 你")); }

4. En henvisning til ApplicationContext

Nogle gange er vi nødt til at få henvisningen til ApplicationContext inde i bønnerne, der styres af det, kan vi bruge ApplicationContextAware eller @Autowired at gøre dette. Lad os se, hvordan du bruger ApplicationContextAware arbejder:

Vi har en Rute klasse med navn:

offentlig klasse Kursus {privat strengnavn; // standardkonstruktører, getters og settere}

Vi har en Lærer klasse, der samler sine kurser i henhold til beholderens bønner:

offentlig klasse Lærer implementerer ApplicationContextAware {privat ApplicationContext kontekst; private List-kurser = ny ArrayList (); @Override public void setApplicationContext (ApplicationContext applicationContext) kaster BeansException {this.context = applicationContext; } @PostConstruct public void addCourse () {if (context.containsBean ("math")) {Course math = context.getBean ("math", Course.class); kurser. tilføj (matematik); } if (context.containsBean ("physics")) {Course physics = context.getBean ("physics", Course.class); kurser. tilføj (fysik); }} // standardkonstruktører, getters og settere}

Lad os konfigurere Rute bønne og lærer bønne i classpathxmlapplicationcontext-example.xml:

Derefter - test injektionen af kurser ejendom:

@Test offentlig ugyldig testApplicationContextAware () {ApplicationContext context = new ClassPathXmlApplicationContext ("classpathxmlapplicationcontext-example.xml"); Lærerlærer = context.getBean ("lærer", lærer.klasse); Listekurser = teacher.getCourses (); assertThat (courses.size (), equalTo (1)); assertThat (courses.get (0) .getName (), equalTo ("matematik")); }

Udover at implementere ApplicationContextAware interface ved hjælp af @Autowired kommentar har samme virkning.

Lad os ændre Lærer klasse til dette:

offentlig klasselærer {@Autowired privat ApplicationContext-kontekst; private List-kurser = ny ArrayList (); @PostConstruct public void addCourse () {if (context.containsBean ("math")) {Course math = context.getBean ("math", Course.class); kurser. tilføj (matematik); } hvis (context.containsBean ("fysik")) {Course physics = context.getBean ("physics", Course.class); kurser. tilføj (fysik); }} // standardkonstruktører, getters og settere}

Kør derefter testen, vi kan se, at resultatet er det samme.

5. Konklusion

ApplicationContext er en springcontainer med mere virksomhedsspecifikke funktioner sammenlignet med BeanFactory, og ClassPathXmlApplicationContext er en af ​​dens mest anvendte implementeringer.

Så i denne artikel introducerede vi flere aspekter af ClassPathXmlApplicationContext, herunder dets grundlæggende brug, dets lukningsregistreringsfunktionalitet, dets internationaliseringsfunktionalitet og opnåelse af dens reference.

Som altid er den komplette kildekode til eksemplet tilgængelig på GitHub.