Jarný aplikačný kontext

1. Prehľad

V tomto tutoriále sa pozrieme na jar ApplicationConext rozhranie podrobne.

2. The ApplicationContext Rozhranie

Jednou z hlavných funkcií jarného rámca je kontajner IoC (inverzia riadenia). Kontajner Spring IoC je zodpovedný za správu objektov aplikácie. Na dosiahnutie inverzie riadenia používa vstrekovanie závislostí.

Rozhrania BeanFactory a ApplicationContext predstavujú jarný kontajner IoC. Tu, BeanFactory je koreňové rozhranie pre prístup k kontajneru Spring. Poskytuje základné funkcie pre správu fazule.

Na druhej strane ApplicationContext je čiastkové rozhranie rozhrania BeanFactory. Preto ponúka všetky funkcie BeanFactory.

Ďalej to poskytujeviac funkcií špecifických pre podnik. Dôležité vlastnosti ApplicationContextriešenie správ, podpora internacionalizácie, publikovanie udalostí a kontexty špecifické pre aplikačnú vrstvu. Preto ho používame ako predvolený kontajner Spring.

3. Čo je jarná fazuľa?

Predtým, ako sa ponoríme hlbšie do ApplicationContext nádoba, je dôležité vedieť o jarnej fazuli. Na jar je fazuľa objekt, ktorý Jarná nádoba vytvára inštancie, zostavuje a spravuje.

Mali by sme teda nakonfigurovať všetky objekty našej aplikácie ako jarné bôby? Ako osvedčený postup by sme nemali.

Podľa jarnej dokumentácie by sme vo všeobecnosti mali definovať fazuľa pre objekty servisnej vrstvy, objekty prístupu k údajom (DAO), prezentačné objekty, objekty infraštruktúry ako napríklad Hibernate. SessionFactories, Fronty JMS atď.

Spravidla by sme nemali v kontajneri konfigurovať objekty domény s jemným zrnom. Vytvorenie a načítanie doménových objektov je zvyčajne zodpovednosťou DAO a obchodnej logiky.

Poďme si teda definovať jednoduchú triedu Java, ktorú v tomto tutoriále použijeme ako jarnú fazuľu:

verejná trieda AccountService {@Autowired private AccountRepository accountRepository; // zakladatelia a zakladatelia}

4. Konfigurácia fazule v kontajneri

Ako vieme, primárnym zamestnaním spoločnosti ApplicationContext je spravovať fazuľa.

Aplikácia teda musí poskytnúť konfiguráciu fazule fazule ApplicationContext kontajner. Konfigurácia jarnej fazule preto pozostáva z jednej alebo viacerých definícií fazule. Jar tiež podporuje rôzne spôsoby konfigurácie fazule.

4.1. Konfigurácia na báze Java

Najskôr začneme s konfiguráciou založenou na prostredí Java, pretože je to najnovší a najpreferovanejší spôsob konfigurácie fazule. Je k dispozícii od jari 3.0.

Konfigurácia Java sa zvyčajne používa @Bean- anotované metódy v rámci a @ Konfigurácia trieda. The @Bean anotácia k metóde naznačuje, že metóda vytvorí jarnú fazuľu. Trieda navyše komentovaná @ Konfigurácia označuje, že obsahuje konfigurácie jarných bôbov.

Poďme teda teraz vytvoriť konfiguračnú triedu na definovanie našej AccountService trieda ako jarná fazuľa:

@Configuration public class AccountConfig {@Bean public AccountService accountService () {vrátiť nový AccountService (accountRepository ()); } @Bean public AccountRepository accountRepository () {vrátiť nové AccountRepository (); }}

4.2. Konfigurácia založená na anotáciách

Jar 2.5 predstavila konfiguráciu založenú na anotáciách ako prvý krok k povoleniu konfigurácií fazule v Jave.

V tomto prístupe najskôr povolíme konfiguráciu založenú na anotáciách prostredníctvom konfigurácie XML. Potom použijeme sadu anotácií na našich triedach, metódach, konštruktoroch alebo poliach Java na konfiguráciu fazule. Niektoré príklady týchto anotácií sú @ Komponent, @ Kontrolór, @Služba, @Úložisko, @Autowireda @Qualifier.

Je pozoruhodné, že tieto poznámky používame aj pri konfigurácii založenej na prostredí Java. Spring taktiež s každým vydaním pridáva k týmto anotáciám ďalšie možnosti.

Pozrime sa teda na jednoduchý príklad tejto konfigurácie.

Najskôr vytvoríme konfiguráciu XML, user-bean-config.xml, aby ste povolili anotácie:

Tu, the anotácia-konfigurácia značka umožňuje mapovanie založené na anotáciách. Tiež skenovanie komponentov Značka povie Springu, kde má hľadať anotované triedy.

Po druhé, vytvoríme UserService triedy a definovať ju ako jarnú fazuľu pomocou @ Komponent anotácia:

@ Komponenta verejná trieda UserService {// kód používateľskej služby}

A potom napíšeme jednoduchý testovací prípad na otestovanie tejto konfigurácie:

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

4.3. Konfigurácia založená na XML

Na záver sa pozrime na konfiguráciu založenú na XML. Je to tradičný spôsob konfigurácie fazule na jar.

Je zrejmé, že v tomto prístupe robíme všetko bean mapovania v konfiguračnom súbore XML.

Poďme teda vytvoriť konfiguračný súbor XML, account-bean-config.xml, a definujte fazuľa pre našu AccountService trieda:

5. Druhy ApplicationContext

Jar poskytuje rôzne druhy ApplicationContext nádoby vhodné pre rôzne požiadavky. Toto sú implementácie ApplicationContext rozhranie. Poďme sa teda pozrieť na niektoré z bežných typov ApplicationContext.

5.1. AnnotationConfigApplicationContext

Najprv sa pozrime na AnnotationConfigApplicationContext triedy, ktorá bola predstavená na jar 3.0. Môže to trvať triedy s poznámkami @ Konfigurácia, @ Komponent, a metadáta JSR-330 ako vstup.

Pozrime sa teda na jednoduchý príklad použitia súboru AnnotationConfigApplicationContext kontajner s našou konfiguráciou založenou na prostredí Java:

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

5.2. AnnotationConfigWebApplicationContext

AnnotationConfigWebApplicationContextje webový variant z AnnotationConfigApplicationContext.

Túto triedu môžeme použiť, keď konfigurujeme Spring ContextLoaderListener poslucháč servletu alebo Spring MVC DispatcherServlet, v web.xml spis.

Od jari 3.0 a ďalej môžeme tento kontextový kontajner aplikácie nakonfigurovať aj programovo. Všetko, čo musíme urobiť, je implementovať WebApplicationInitializer rozhranie:

public class MyWebApplicationInitializer implementuje WebApplicationInitializer {public void onStartup (ServletContext container) throws ServletException {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext (); context.register (AccountConfig.class); context.setServletContext (kontajner); // konfigurácia servletu}}

5.3. XmlWebApplicationContext

Ak použijeme Konfigurácia založená na XML vo webovej aplikácii, môžeme použiť XmlWebApplicationContext trieda.

Konfigurácia tohto kontajnera je v skutočnosti ako AnnotationConfigWebApplicationContext iba triedy, čo znamená, že ho môžeme nakonfigurovať v web.xml alebo implementovať WebApplicationInitializer rozhranie:

public class MyXmlWebApplicationInitializer implementuje WebApplicationInitializer {public void onStartup (ServletContext container) hodí ServletException {XmlWebApplicationContext context = new XmlWebApplicationContext (); context.setConfigLocation ("/ WEB-INF / jar / applicationContext.xml"); context.setServletContext (kontajner); // konfigurácia servletu}}

5.4. FileSystemXMLApplicationContext

Používame FileSystemXMLApplicationContext trieda do načítajte konfiguračný súbor Spring založený na XML zo súborového systému alebo z adries URL. Táto trieda je užitočná, keď potrebujeme načítať ApplicationContext programovo. Medzi možné prípady použitia tohto testu patria vo všeobecnosti testovacie zväzky a samostatné aplikácie.

Pozrime sa napríklad, ako môžeme vytvoriť tento kontajner Spring a načítať fazuľa pre našu konfiguráciu založenú na XML:

Reťazcová cesta = "C: /myProject/src/main/resources/applicationcontext/account-bean-config.xml"; ApplicationContext context = nový FileSystemXmlApplicationContext (cesta); AccountService accountService = context.getBean ("accountService", AccountService.class);

5.5. ClassPathXmlApplicationContext

Pre prípad, že by sme chceli načítať konfiguračný súbor XML z cesty triedy, môžeme použiť ClassPathXmlApplicationContext trieda. Podobný FileSystemXMLApplicationContext, je to užitočné pre testovacie zväzky aj pre aplikačné kontexty vložené do súborov JAR.

Pozrime sa teda na príklad použitia tejto triedy:

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

6. Ďalšie funkcie ApplicationContext

6.1. Rozlíšenie správy

The ApplicationContext rozhranie podporuje rozlíšenie správ a internacionalizácia rozšírením MessageSource rozhranie. Spring ďalej poskytuje dve MessageSource implementácie, ResourceBundleMessageSource a StaticMessageSource.

Môžeme použiť StaticMessageSource programovo pridávať správy k zdroju. Podporuje však základnú internacionalizáciu a je vhodnejšia na testovanie ako na použitie vo výrobe.

Na druhej strane, ResourceBundleMessageSource je najbežnejšou implementáciou MessageSource. Spolieha sa na základné JDK ResouceBundle implementácia. Používa tiež štandardnú analýzu správ JDK, ktorú poskytuje MessageFormat.

Teraz sa pozrime, ako môžeme použiť MessageSource na čítanie správ zo súboru vlastností.

Najskôr vytvoríme správy.vlastnosti súbor na triednej ceste:

account.name = TestAccount

Po druhé, do našej pridáme definíciu fazule AccountConfig trieda:

@Bean public MessageSource messageSource () {ResourceBundleMessageSource messageSource = nový ResourceBundleMessageSource (); messageSource.setBasename ("config / messages"); návrat messageSource; }

Po tretie, vpichneme injekciu MessageSource v AccountService:

@Autowired private MessageSource messageSource;

Nakoniec môžeme použiť getMessage metóda kdekoľvek v AccountService prečítať správu:

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

Jar tiež poskytuje ReloadableResourceBundleMessageSource trieda, ktorá umožňuje čítanie súborov z ľubovoľného umiestnenia zdrojov Spring a podporuje rýchle načítanie súborov vlastností zväzku.

6.2. Spracovanie udalostí

ApplicationContext podporuje spracovanie udalostí s pomocou ApplicationEvent triedy a ApplicationListener rozhranie. Podporuje zabudované udalosti ako ContextStartedEvent, ContextStoppedEvent, ContextClosedEventa RequestHandledEvent. Okrem toho podporuje aj vlastné udalosti pre prípady firemného použitia.

7. Záver

V tomto tutoriáli sme diskutovali o rôznych aspektoch ApplicationContext kontajner na jar. Videli sme rôzne príklady toho, ako nakonfigurovať jarné fazule v AppicationContext. Tiež sme videli, ako vytvárať a používať rôzne typy ApplicationContext.

Celý kód je ako vždy k dispozícii na stránkach GitHub.