Introduksjon til Spring ClassPathXmlApplicationContext

1. Oversikt

Spring Framework-kjernen er enkelt sagt en IoC-beholder som brukes til å administrere bønner.

Det er to grunnleggende typer containere om våren - Bean Factory og Application Context. Førstnevnte gir grunnleggende funksjoner, som er introdusert her; sistnevnte er et supersett av førstnevnte og er mest brukt.

ApplicationContext er et grensesnitt i org.springframework.context pakken, og den har flere implementeringer, og ClassPathXmlApplicationContext er en av disse.

I denne artikkelen vil vi fokusere på de nyttige funksjonene som tilbys av ClassPathXmlApplicationContext.

2. Grunnleggende bruk

2.1. Initialiser beholder og administrer bønner

ClassPathXmlApplicationContext kan laste inn en XML-konfigurasjon fra en klassesti og administrere bønner:

Vi har en Student klasse:

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

Vi konfigurerer en Student bønne i classpathxmlapplicationcontext-example.xml og legg den til i en klassevei:

Nå kan vi bruke ClassPathXmlApplicationContext for å laste inn XML-konfigurasjonen og få Student bønne:

@Test offentlig ugyldig testBasicUsage () {ApplicationContext context = new ClassPathXmlApplicationContext ("classpathxmlapplicationcontext-example.xml"); Studentstudent = (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-konfigurasjoner

Noen ganger vil vi bruke flere XML-konfigurasjoner til å initialisere en Spring container. I så fall må vi bare legge til flere konfigurasjonssteder når vi bygger ApplicationContext:

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

3. Ytterligere evner

3.1. Slå vårens IoC-beholder elegant

Når vi bruker Spring IoC container i en webapplikasjon, er Spring nettbasert ApplicationContext implementeringer vil stenge beholderen grasiøst når applikasjonen lukkes, men hvis vi bruker den i et ikke-web-miljø, for eksempel et frittstående skrivebordsprogram, må vi registrere en avstengningskrok med JVM selv for å sikre at våren IoC-container lukkes elegant og kaller destrueringsmetodene for å frigjøre ressurser.

La oss legge til en ødelegge() metoden til Student klasse:

public void destroy () {System.out.println ("Student (no:" + no + ") er ødelagt"); }

Vi kan nå konfigurere denne metoden som student bønne ødelegge metoden:

Vi registrerer nå en avstengningskrok:

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

Når vi kjører testmetoden, kan vi se ødelegge() metoden kalles.

3.2. Internasjonalisering med MessageSource

De ApplicationContext grensesnitt utvider MessageSource grensesnitt, gir derfor internasjonaliseringsfunksjonalitet.

An ApplicationContext container søker automatisk etter en MessageSource bønne i initialiseringen, og bønnen må navngis som messageSource.

Her er et eksempel på bruk av forskjellige språk med MessageSource:

La oss først legge til en dialog katalog i en klassebane og legg til to filer i dialogboksen: dialog_en.egenskaper og dialog_zh_CN.egenskaper.

dialog_en.egenskaper:

hei = hei du = takk = takk {0}

dialog_zh_CN.egenskaper:

hei = \ u4f60 \ u597d deg = \ u4f60 takk = \ u8c22 \ u8c22 {0}

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

    dialog / dialog 

La oss så få forskjellige språk 'dialogord med MessageSource:

@Test public void testInternationalization () {MessageSource resources = new ClassPathXmlApplicationContext ("classpathxmlapplicationcontext-internationalization.xml"); Streng enHello = resources.getMessage ("hallo", null, "Standard", Lokalitet.ENGLISH); String enYou = resources.getMessage ("du", null, Locale.ENGLISH); Streng enThanks = resources.getMessage ("takk", nytt objekt [] {enYou}, Locale.ENGLISH); assertThat (enHello, equalTo ("hallo")); assertThat (enThanks, equalTo ("takk")); Streng chHello = resources.getMessage ("hei", null, "Standard", Lokalitet.SIMPLIFIED_CHINESE); String chYou = resources.getMessage ("du", null, Locale.SIMPLIFIED_CHINESE); Streng chThanks = resources.getMessage ("takk", nytt objekt [] {chYou}, språk.SIMPLIFIED_CHINESE); assertThat (chHello, equalTo ("你好")); assertThat (chThanks, equalTo ("谢谢 你")); }

4. En referanse til ApplicationContext

Noen ganger må vi få referansen til ApplicationContext inne i bønnene som styres av den, kan vi bruke ApplicationContextAware eller @Autowired å gjøre dette. La oss se hvordan du bruker ApplicationContextAware virker:

Vi har en Kurs klasse med navn:

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

Vi har en Lærer klasse som monterer sine kurs i henhold til beholderens bønner:

offentlig klasse Lærer implementerer ApplicationContextAware {private ApplicationContext kontekst; private List-kurs = ny ArrayList (); @Override public void setApplicationContext (ApplicationContext applicationContext) kaster BeansException {this.context = applicationContext; } @ PostConstruct public void addCourse () {if (context.containsBean ("matematikk")) {Course math = context.getBean ("math", Course.class); kurs. legge til (matematikk); } if (context.containsBean ("physics")) {Course physics = context.getBean ("physics", Course.class); kurs. legge til (fysikk); }} // standardkonstruktører, getters og setters}

La oss konfigurere kurs bønne og lærer bønne i classpathxmlapplicationcontext-example.xml:

Deretter - test injeksjonen av kurs eiendom:

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

Foruten å implementere ApplicationContextAware grensesnitt, ved hjelp av @Autowired kommentar har samme effekt.

La oss endre Lærer klasse til dette:

offentlig klasse lærer {@Autowired private ApplicationContext context; private List-kurs = ny ArrayList (); @PostConstruct public void addCourse () {if (context.containsBean ("math")) {Course math = context.getBean ("math", Course.class); kurs. legge til (matematikk); } if (context.containsBean ("physics")) {Course physics = context.getBean ("physics", Course.class); kurs. legge til (fysikk); }} // standardkonstruktører, getters og setters}

Kjør deretter testen, vi kan se at resultatet er det samme.

5. Konklusjon

ApplicationContext er en vårcontainer med mer bedriftsspesifikke funksjoner i forhold til BeanFactory, og ClassPathXmlApplicationContext er en av de mest brukte implementeringene.

Så i denne artikkelen introduserte vi flere aspekter av ClassPathXmlApplicationContext, inkludert grunnleggende bruk, funksjonalitet for nedleggingsregistrering, internasjonaliseringsfunksjonalitet og innhenting av referanse.

Som alltid er den komplette kildekoden for eksemplet tilgjengelig på GitHub.


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