Proljetni kontekst aplikacije

1. Pregled

U ovom ćemo uputstvu pogledati proljeće ApplicationConext detaljno sučelje.

2. The ApplicationContext Sučelje

Jedna od glavnih značajki Spring okvira je IoC (Inverzija kontrole) spremnik. Spring IoC spremnik odgovoran je za upravljanje objektima aplikacije. Koristi injekciju ovisnosti za postizanje inverzije kontrole.

Sučelja BeanFactory i ApplicationContext predstavljaju Spring IoC spremnik. Ovdje, BeanFactory je korijensko sučelje za pristup Spring spremniku. Pruža osnovne funkcionalnosti za upravljanje grahom.

S druge strane, ApplicationContext je sučelje sučelja BeanFactory. Stoga nudi sve funkcionalnosti BeanFactory.

Nadalje, to pružaviše funkcionalnosti specifičnih za poduzeće. Važne značajke ApplicationContext jesu rješavanje poruka, podržavanje internacionalizacije, objavljivanje događaja i konteksti specifični za aplikacijski sloj. Zbog toga ga koristimo kao zadani Spring spremnik.

3. Što je proljetni grah?

Prije nego što zaronimo dublje u ApplicationContext spremnik, važno je znati o proljetnom grahu. U proljeće grah je objekt koji Spring spremnik instancira, sastavlja i njime upravlja.

Pa, bismo li trebali konfigurirati sve objekte naše aplikacije kao proljetni grah? Pa, kao najbolja praksa, ne bismo trebali.

Prema proljetnoj dokumentaciji, općenito, trebali bismo definirati grah za objekte uslužnog sloja, objekte za pristup podacima (DAO), prezentacijske objekte, infrastrukturne objekte kao što je Hibernate Tvornice Sesije, JMS redovi i tako dalje.

Također, obično ne bismo trebali konfigurirati sitnozrnate objekte domene u spremniku. Obično je odgovornost DAO-a i poslovne logike za stvaranje i učitavanje objekata domene.

Dakle, definirajmo jednostavnu Java klasu koju ćemo koristiti kao proljetni grah u ovom vodiču:

javna klasa AccountService {@Autowired private AccountRepository accountRepository; // geteri i postavljači}

4. Konfiguriranje graha u spremniku

Kao što znamo, primarni posao ApplicationContext je upravljanje grahom.

Dakle, aplikacija mora pružiti konfiguraciju graha za ApplicationContext kontejner. Stoga se konfiguracija Spring graha sastoji od jedne ili više definicija graha. Također, Spring podržava različite načine konfiguriranja graha.

4.1. Konfiguracija temeljena na Javi

Prvo ćemo započeti s Java konfiguracijom jer je to najnoviji i najpoželjniji način konfiguracije graha. Dostupan je od proljeća 3.0 nadalje.

Java konfiguracija obično koristi @Grah-anotirane metode unutar a @Konfiguracija razred. The @Grah napomena o metodi ukazuje na to da metoda stvara proljetni grah. Štoviše, razred označen s @Konfiguracija označava da sadrži konfiguracije proljetnog zrna.

Dakle, hajde sada stvorimo klasu konfiguracije koja će definirati našu AccountService razred kao proljetni grah:

@Configuration javna klasa AccountConfig {@Bean public AccountService accountService () {return new AccountService (accountRepository ()); } @Bean public AccountRepository accountRepository () {return new AccountRepository (); }}

4.2. Konfiguracija temeljena na bilješkama

Spring 2.5 predstavio je konfiguraciju temeljenu na bilješkama kao prvi korak za omogućavanje konfiguracija graha u Javi.

U ovom pristupu prvo omogućujemo konfiguraciju temeljenu na napomenama putem XML konfiguracije. Zatim koristimo skup bilješki na našim Java klasama, metodama, konstruktorima ili poljima za konfiguriranje graha. Neki primjeri ovih bilješki su @Komponenta, @Controller, @Servis, @ Repozitorij, @Autowired, i @Kvalifikator.

Značajno je da ove napomene koristimo i s Java konfiguracijom. Također, Spring nastavlja dodavati više mogućnosti ovim bilješkama sa svakim izdanjem.

Dakle, pogledajmo jednostavan primjer ove konfiguracije.

Prvo ćemo stvoriti XML konfiguraciju, user-bean-config.xml, da biste omogućili napomene:

Ovdje, the napomena-konfiguracija Oznaka omogućuje mapiranje temeljeno na bilješkama. Također, skeniranje komponenata tag govori Springu gdje treba tražiti označene klase.

Drugo, mi ćemo stvoriti Korisnička usluga klase i definirajte ga kao proljetni grah pomoću @Komponenta napomena:

@Component javna klasa UserService {// korisnički servisni kod}

A onda ćemo napisati jednostavan testni slučaj za testiranje ove konfiguracije:

ApplicationContext context = new ClassPathXmlApplicationContext ("applicationcontext / user-bean-config.xml"); UserService userService = context.getBean (UserService.class); assertNotNull (userService);

4.3. Konfiguracija temeljena na XML-u

Na kraju, pogledajmo konfiguraciju temeljenu na XML-u. To je tradicionalni način konfiguriranja graha u proljeće.

Očito je da u ovom pristupu radimo svi preslikavanja graha u XML konfiguracijskoj datoteci.

Pa, kreirajmo XML konfiguracijsku datoteku, account-bean-config.xml, i definirajte grah za naš AccountService razred:

5. Vrste ApplicationContext

Proljeće pruža različite vrste ApplicationContext spremnici prikladni za različite zahtjeve. To su implementacije ApplicationContext sučelje. Dakle, pogledajmo neke od uobičajenih vrsta ApplicationContext.

5.1. AnnotationConfigApplicationContext

Prvo, da vidimo AnnotationConfigApplicationContext razreda, koji je predstavljen u proljeće 3.0. Može potrajati klase označene sa @Konfiguracija, @Komponenta, i metapodaci JSR-330 kao ulazni podaci.

Dakle, pogledajmo jednostavan primjer korištenja AnnotationConfigApplicationContext spremnik s našom Java konfiguracijom:

ApplicationContext context = new AnnotationConfigApplicationContext (AccountConfig.class); AccountService accountService = context.getBean (AccountService.class);

5.2. AnnotationConfigWebApplicationContext

AnnotationConfigWebApplicationContextje internetska varijanta od AnnotationConfigApplicationContext.

Ovu klasu možemo koristiti kad konfiguriramo Spring's ContextLoaderListener slušatelj servleta ili Spring MVC DispatcherServlet, u web.xml datoteka.

Štoviše, od proljeća 3.0 nadalje, također možemo programski konfigurirati ovaj spremnik konteksta aplikacije. Sve što trebamo učiniti je implementirati WebApplicationInitializer sučelje:

javna klasa MyWebApplicationInitializer provodi WebApplicationInitializer {javna praznina onStartup (spremnik ServletContext) baca ServletException {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext (); context.register (AccountConfig.class); context.setServletContext (spremnik); // konfiguracija servleta}}

5.3. XmlWebApplicationContext

Ako koristimo Konfiguracija temeljena na XML-u u web aplikaciji, možemo koristiti XmlWebApplicationContext razred.

U stvari, konfiguriranje ovog spremnika je poput AnnotationConfigWebApplicationContext class, što znači da ga možemo konfigurirati u web.xml ili implementirati WebApplicationInitializer sučelje:

javna klasa MyXmlWebApplicationInitializer provodi WebApplicationInitializer {javna praznina onStartup (spremnik ServletContext) baca ServletException {XmlWebApplicationContext context = new XmlWebApplicationContext (); context.setConfigLocation ("/ WEB-INF / spring / applicationContext.xml"); context.setServletContext (spremnik); // konfiguracija servleta}}

5.4. FileSystemXMLApplicationContext

Koristimo FileSystemXMLApplicationContext razred do učitajte konfiguracijsku datoteku Spring Spring koja se temelji na XML-u iz datotečnog sustava ili s URL-ova. Ova je klasa korisna kada trebamo učitati ApplicationContext programski. Općenito, testni uprtači i samostalne aplikacije su neki od mogućih slučajeva upotrebe za to.

Na primjer, pogledajmo kako možemo stvoriti ovaj Spring spremnik i učitati grah za našu XML-zasnovanu konfiguraciju:

Staza niza = "C: /myProject/src/main/resources/applicationcontext/account-bean-config.xml"; ApplicationContext context = new FileSystemXmlApplicationContext (put); AccountService accountService = context.getBean ("accountService", AccountService.class);

5.5. ClassPathXmlApplicationContext

U slučaju da to želimo učitajte XML konfiguracijsku datoteku s putova predavanja, možemo koristiti ClassPathXmlApplicationContext razred. Slično FileSystemXMLApplicationContext, korisno je za ispitne pojaseve kao i za kontekst primjene ugrađen u JAR-ove.

Pa, pogledajmo primjer korištenja ove klase:

ApplicationContext context = new ClassPathXmlApplicationContext ("applicationcontext / account-bean-config.xml"); AccountService accountService = context.getBean ("accountService", AccountService.class);

6. Dodatne značajke ApplicationContext

6.1. Razlučivanje poruka

The ApplicationContext sučelje podržava razlučivanje poruka i internacionalizacija proširivanjem MessageSource sučelje. Nadalje, Spring nudi dva MessageSource implementacije, ResourceBundleMessageSource i StaticMessageSource.

Možemo koristiti StaticMessageSource za programsko dodavanje poruka izvoru. Međutim, podržava osnovnu internacionalizaciju i prikladniji je za ispitivanja nego za proizvodnju.

S druge strane, ResourceBundleMessageSource je najčešća primjena MessageSource. Oslanja se na temeljne JDK-ove ResouceBundle provedba. Također koristi JDK-ovo standardno raščlanjivanje poruka koje pruža Oblik poruke.

Sada, da vidimo kako možemo koristiti MessageSource za čitanje poruka iz datoteke svojstava.

Prvo ćemo stvoriti poruke.svojstva datoteka na putu predavanja:

account.name = TestAccount

Drugo, u našu ćemo dodati definiciju graha AccountConfig razred:

@Bean public MessageSource messageSource () {ResourceBundleMessageSource messageSource = novi ResourceBundleMessageSource (); messageSource.setBasename ("config / messages"); return messageSource; }

Treće, ubrizgat ćemo MessageSource u AccountService:

@Autowired private MessageSource messageSource;

Napokon, možemo koristiti getMessage bilo gdje u AccountService da pročitate poruku:

messageSource.getMessage ("account.name", null, Locale.ENGLISH);

Proljeće također pruža ReloadableResourceBundleMessageSource klasa, koja omogućuje čitanje datoteka s bilo kojeg mjesta izvora Spring i podržava vruće ponovno učitavanje datoteka svojstva snopa.

6.2. Rukovanje događajima

ApplicationContext podržava rukovanje događajima uz pomoć ApplicationEvent razred i ApplicationListener sučelje. Podržava ugrađene događaje poput ContextStartedEvent, ContextStoppedEvent, ContextClosedEvent, i RequestHandledEvent. Štoviše, također podržava prilagođene događaje za slučajeve poslovne upotrebe.

7. Zaključak

U ovom uputstvu raspravljali smo o različitim aspektima ApplicationContext kontejner u proljeće. Vidjeli smo različite primjere kako konfigurirati proljetni grah u AppicationContext. Također, vidjeli smo kako stvoriti i koristiti različite vrste ApplicationContext.

Kao i uvijek, cjeloviti kôd dostupan je na GitHub-u.