Rövid útmutató a tavaszi bab hatóköréhez

1. Áttekintés

Ebben a gyors bemutatóban megismerheti a különböző típusú bab hatóköröket a tavaszi keretrendszerben.

A bab hatóköre meghatározza annak a babnak az életciklusát és láthatóságát abban a kontextusban, amelyben felhasználják.

A Spring framework legújabb verziója hatféle hatókört határoz meg:

  • szingli
  • prototípus
  • kérés
  • ülés
  • Alkalmazás
  • webaljzat

Az utóbbi négy hatókör megemlítése kérés, munkamenet, alkalmazás és webaljzat csak webtudatos alkalmazásban érhetők el.

2. Singleton hatóköre

A bab meghatározása szingli A hatókör azt jelenti, hogy a konténer egyetlen példányt hoz létre a babból, és az adott babnévre vonatkozó összes kérelem ugyanazt az objektumot adja vissza, amely gyorsítótárban található. Az objektum bármilyen módosítása a babra vonatkozó minden hivatkozásban tükröződik. Ez a hatókör az alapértelmezett érték, ha nincs megadva más hatókör.

Hozzunk létre egy Személy entitás a hatókör fogalmának példázására:

public class Személy {private String név; // szabványos kivitelező, mérőeszközök és beállítók}

Utána meghatározzuk a babot szingli hatókörét a @Scope kommentár:

@Bean @Scope ("singleton") public Person personSingleton () {return new Person (); }

A. Helyett használhatunk konstansot is Húr érték a következő módon:

@Scope (érték = ConfigurableBeanFactory.SCOPE_SINGLETON)

Most egy olyan tesztet írunk, amely megmutatja, hogy két, ugyanazon babra utaló objektumnak ugyanazok az értékei lesznek, még akkor is, ha csak az egyikük változtatja meg az állapotát, mivel mindkettő ugyanazon babpéldányra hivatkozik:

privát statikus végső karakterlánc NAME = "John Smith"; @Test public void givenSingletonScope_whenSetName_thenEqualNames () {ApplicationContext applicationContext = new ClassPathXmlApplicationContext ("scopes.xml"); Személy personSingletonA = (Személy) applicationContext.getBean ("personSingleton"); Személy personSingletonB = (Személy) applicationContext.getBean ("personSingleton"); personSingletonA.setName (Név); Assert.assertEquals (Név, personSingletonB.getName ()); (((AbstractApplicationContext) applicationContext) .close (); }

A scopes.xml Az ebben a példában szereplő fájlnak tartalmaznia kell a használt bab xml definícióit:

3. Prototípus hatókör

Egy bab prototípus A hatókör egy másik példányt ad vissza minden alkalommal, amikor a tárolótól kérik. Az érték beállításával határozható meg prototípus hoz @Scope annotáció a babdefinícióban:

@Bean @Scope ("prototípus") public Person personPrototype () {return new Person (); }

Használhatunk konstansot is, mint a szingulett hatókörnél:

@Scope (érték = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Most egy hasonló tesztet fogunk írni, mint korábban, amely azt mutatja, hogy két objektum, amely ugyanazt a babnevet kéri, és amelynek prototípusa hatókör, eltérő állapotúak lesznek, mivel már nem ugyanazon babpéldányra vonatkoznak:

privát statikus végső karakterlánc NAME = "John Smith"; privát statikus végleges karakterlánc NAME_OTHER = "Anna Jones"; @Test public void givenPrototypeScope_whenSetNames_thenDifferentNames () {ApplicationContext applicationContext = new ClassPathXmlApplicationContext ("scopes.xml"); Person personPrototypeA = (Személy) applicationContext.getBean ("personPrototype"); Person personPrototypeB = (Személy) applicationContext.getBean ("personPrototype"); personPrototypeA.setName (Név); personPrototypeB.setName (NAME_OTHER); Assert.assertEquals (Név, personPrototypeA.getName ()); Assert.assertEquals (NAME_OTHER, personPrototypeB.getName ()); (((AbstractApplicationContext) applicationContext) .close (); } 

A scopes.xml fájl hasonló az előző szakaszban bemutatotthoz, miközben hozzáadja a bab xml definícióját a prototípus hatókör:

4. Web Aware hatókörök

Mint említettük, további négy hatókör létezik, amelyek csak webtudatos alkalmazás-környezetben érhetők el. Ezeket a gyakorlatban ritkábban használják.

A kérés a hatókör egy bab-példányt hoz létre egyetlen HTTP kéréshez, míg az session hatókör létrehoz egy HTTP munkamenethez.

A Alkalmazás a hatókör létrehozza a bab példányát az a életciklusához ServletContext és a webaljzat hatókör létrehozza egy adott számára WebSocket ülés.

Hozzunk létre egy osztályt, amelyet a bab szemléltetésére használunk:

public class HelloMessageGenerator {private String üzenet; // standard getter és setter}

4.1. Kérelem hatóköre

A babot definiálhatjuk kérés hatókör a @Scope kommentár:

@Bean @Scope (érték = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) public HelloMessageGenerator requestScopedBean () {return new HelloMessageGenerator (); }

A proxyMode attribútumra azért van szükség, mert a webalkalmazás-kontextus példányosításának pillanatában nincs aktív kérés. Tavasz létrehoz egy proxy-t, amelyet függőségként kell beadni, és példányosítja a célbabot, amikor arra szükség van.

Használhatjuk a @RequestScope összeállított kommentár, amely a fenti definíció parancsikonjaként működik:

@Bean @RequestScope public HelloMessageGenerator requestScopedBean () {return new HelloMessageGenerator (); }

Ezután meghatározhatunk egy vezérlőt, amely beinjektált hivatkozással rendelkezik a requestScopedBean. Kétszer kell hozzáférnünk ugyanahhoz a kéréshez a webspecifikus hatókörök teszteléséhez.

Ha megjelenítjük a üzenet a kérés minden egyes futtatásakor láthatjuk, hogy az érték visszaáll nulla, annak ellenére, hogy később módosítják a módszerben. Ennek az az oka, hogy minden egyes kéréshez más bab példány érkezik.

@Controller public class ScopesController {@Resource (name = "requestScopedBean") HelloMessageGenerator requestScopedBean; @RequestMapping ("/ scopes / request") public String getRequestScopeMessage (végleges modellmodell) {model.addAttribute ("előzőMessage", requestScopedBean.getMessage ()); requestScopedBean.setMessage ("Jó reggelt!"); model.addAttribute ("currentMessage", requestScopedBean.getMessage ()); return "scopesExample"; }}

4.2. Munkamenet hatóköre

A babot definiálhatjuk ülés hatálya hasonló módon:

@Bean @Scope (érték = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) nyilvános HelloMessageGenerator sessionScopedBean () {return new HelloMessageGenerator (); }

Van egy dedikált összetett kommentár is, amelyet a bab meghatározásának egyszerűsítésére használhatunk:

@Bean @SessionScope public HelloMessageGenerator sessionScopedBean () {return new HelloMessageGenerator (); }

Ezután meghatározunk egy vezérlőt a hivatkozással sessionScopedBean. Ismét két kérést kell futtatnunk annak bizonyítására, hogy a üzenet mező ugyanaz a munkamenetnél.

Ebben az esetben, amikor a kérelmet először teszik meg, az értéket üzenet van nulla. De ha egyszer megváltoztatja, akkor ez az érték megmarad a későbbi kéréseknél, mivel a bab ugyanaz a példánya visszatér az egész munkamenethez.

@Controller nyilvános osztály ScopesController {@Resource (name = "sessionScopedBean") HelloMessageGenerator sessionScopedBean; @RequestMapping ("/ scopes / session") public String getSessionScopeMessage (végső modellmodell) {model.addAttribute ("előzőMessage", sessionScopedBean.getMessage ()); sessionScopedBean.setMessage ("Jó napot!"); model.addAttribute ("currentMessage", sessionScopedBean.getMessage ()); return "scopesExample"; }}

4.3. Alkalmazási kör

A Alkalmazás a hatókör létrehozza a bab példányát az a életciklusához ServletContext.

Ez hasonló a szingulett hatókörhöz, de nagyon fontos különbség van a bab hatókörét illetően.

Amikor a bab Alkalmazás hatókörét a bab ugyanazon példánya osztja meg több, ugyanazon futó servlet-alapú alkalmazás között ServletContext, míg az egyszemélyes hatókörű babokat csak egyetlen alkalmazási kontextusban alkalmazzák.

Hozzuk létre a babot Alkalmazás hatókör:

@Bean @Scope (érték = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS) public HelloMessageGenerator applicationScopedBean () {return new HelloMessageGenerator (); }

Hasonlóan, mint a kérés és ülés hatókörök, használhatunk rövidebb verziót is:

@Bean @ApplicationScope public HelloMessageGenerator applicationScopedBean () {return new HelloMessageGenerator (); }

Most hozzunk létre egy vezérlőt, amely hivatkozik erre a babra:

@Controller nyilvános osztály ScopesController {@Resource (name = "applicationScopedBean") HelloMessageGenerator applicationScopedBean; @RequestMapping ("/ scopes / application") public String getApplicationScopeMessage (végleges modellmodell) {model.addAttribute ("előzőMessage", applicationScopedBean.getMessage ()); applicationScopedBean.setMessage ("Jó napot!"); model.addAttribute ("currentMessage", applicationScopedBean.getMessage ()); return "scopesExample"; }}

Ebben az esetben érték üzenet miután beállította a applicationScopedBean megmarad minden későbbi kérésnél, munkamenetnél, sőt egy másik szervletalkalmazásnál is, amely hozzáférni fog ehhez a babhoz, feltéve, hogy ugyanazon a ServletContext.

4.4. WebSocket hatókör

Végül hozzuk létre a babot webaljzat hatókör:

@Bean @Scope (scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS) public HelloMessageGenerator websocketScopedBean () {return new HelloMessageGenerator (); }

A WebSocket hatókörű babokat az első eléréskor a WebSocket session attribútumok. Ezután a bab ugyanaz a példánya visszaküldésre kerül, valahányszor a bab egészéhez hozzáfér WebSocket ülés.

Azt is mondhatjuk, hogy egyedülálló viselkedést mutat, de az a-ra korlátozódik WebSocket csak munkamenet.

5. Következtetés

Bemutattuk a Spring által biztosított különféle babszemeket és azok felhasználását.

Ennek az oktatóanyagnak a megvalósítása megtalálható a GitHub projektben - ez egy Eclipse-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.