Documente Academic
Documente Profesional
Documente Cultură
TUTORIAL SPRING
FRAMEWORK
Galai 2017
Cuprins
1. Introducere................................................................................................................................3
2. Beneficiile n folosirea Spring..................................................................................................5
3. Folosirea Spring in Eclipse.......................................................................................................7
4. Spring exemplu Hello World..................................................................................................7
5. Spring Inversion of Control (IoC) Inversiunea de control................................................13
6. BeanFactory n Spring.............................................................................................................14
7. ApplicationContext n Spring.................................................................................................16
8. Setter i Constructor Injection n Spring.................................................................................18
9. Injectarea Beans-urilor interioare (inner beans) n Spring......................................................25
10. Injectarea colectiilor in Spring............................................................................................28
11. Bean Autowiring in Spring..................................................................................................33
12. Spring Bean Scopes.............................................................................................................33
13. Folosirea ApplicationContextAware in Spring....................................................................41
14. Spring Bean Definition Inheritance motenirea...............................................................44
15. Spring Bean Life Cycle and Callbacks ciclul de via al bean-ului i reapelri...............48
16. Adnotri n Spring...............................................................................................................55
17. @Autowired Annotation in Spring......................................................................................57
18. Spring JSR-250 adnotri......................................................................................................61
19. Event Handling in Spring Tratarea evenimentelor n Spring...........................................67
20. Spring JDBC Framework....................................................................................................70
21. Spring Transaction Management.........................................................................................81
22. Folosirea Hibernate cu Spring.............................................................................................95
1. Introducere
Spring a fost creat de ctre Rod Johnson in anul 2002 i este un IoC (Inversion of Control)
framework care ne ajuta sa decuplam diversele dependente ale componentelor unui proiect.
Istoricul versiunilor Spring:
Oct 2002- Prima versiune lansata de Rod Johnson (Expert One-on-One J2EE Design and
Development)
Iun 2003- Preia licenta de la Apache si este lansat ca un framework.
Oct 2006- Este lansat Spring 2.0.
Nov 2007- Spring 2.5.
Dec 2009 - Spring 3.0.
Dec 2011- Spring 3.1.
Jun 2012- Spring 3.2.
Spring poate fi gandit ca un cadru de cadre (framework of frameworks) deoarece ofera
suport pentru diferite cadre cum ar fi Struts, Hibernate, Tapestry, EJB, JSF, etc. Cadrul
(framework), in sens mai larg, poate fi definit ca o structura in care gasim solutii la diverse
probleme tehnice. Spring ofer faciliti foarte simple i diverse pentru a integra diverse cadre,
tehnologii i servicii n aplicaii. Unul dintre motivele principale pentru utilizarea Spring este de a
pstra codul ct mai simplu posibil. Spring faciliteaza modul de a dezvolta aplica ii enterprise cu
java beans simple si cuplate slab. Din acest motiv Spring poate fi numit si Plain Old Java Object
(POJO) framework.
Spring este un framework open-source dezvoltat de Spring Source, o divizie a Vmware si
poate fi rezumat n dou moduri:
Container - Spring poate fi descris ca un container cu cerinte reduse, deoarece nu
implic instalarea, configurarea, pornirea i oprirea activitilor asociate cu
containerul. Este doar o simpl colecie de cteva fiiere Java ARchive (JAR), care
trebuie s fie adugate la classpath. Spring ia clasele in aplicatie, creeaz obiecte, i
gestioneaz ciclul de via al acestor obiecte.
Framework - Spring poate fi descris ca un Application Programming Interface (API),
care conine o colecie mare de clase, metode, interfee, adnotri, tag-uri XML care
pot fi utilizate ntr-o aplicaie. API ofer o varietate de clase factory si facade care ne
ajut s utilizam orice cadru sau funcionalitate foarte uor n aplica ia pe care o
dezvoltam.
Spring cuprinde mai multe module, cum ar fi IoC, AOP, DAO, Context, ORM, WEB MVC
etc. In cele ce urmeaza vom prezenta unele dintre aceste module.
Accesul la date utilizand Java Database Connectivity (JDBC): Spring ofer un suport bogat
pentru lucrul cu JDBC. Un cod de tipic JDBC implic: crearea unei conexiuni, declara ii,
executare interogri i manipulare excepii pentru efectuarea operatiilor asupra unei baze de date.
Spring ofer un set de clase care se ocup de aceste operaii de baz JDBC.
Accesul la date prin utilizarea Object Relational Mapping (ORM): Exist o mulime de
framework-uri ORM, cum ar fi Hibernate, Toplink, etc, care pot fi utilizate n aplica ii Java.
Spring ofer o mulime de clase, aceste clase fcnd lucrul cu ORM foarte uor.
Aspect Oriented Programming (AOP): Una dintre principalele paradigme pe care le utilizeaz
Spring pentru a furniza servicii entreprise pentru aplicaii este AOP. AOP este un mecanism prin
care putei introduce funcionaliti n codul existent, fr a modifica design-ul.
Core Spring Framework: Pachetul de baz (core) este partea fundamental a cadrului i asigur
caracteristici IoC i Dependency Injection. Conceptul de baz aici este BeanFactory, care ofer o
implementare sofisticat a modelului factory pattern i ne permite s decuplm configurarea i
specificarea dependenelor din logica programului.
Obiect XML Mapping: Spring 3.0 introduce modulul OXM, care anterior nu a fost o parte a
cadrului de baz. OXM este un mecanism care convertete obiectele n format XML i vice-
versa. Exist o mulime de cadre OXM, cum ar fi Caster, Xstream, JiBX, Java API for XML
Binding (JAXP) i XMLMeabs. Spring 3.0 ofer un API uniform pentru a avea acces la oricare
dintre aceste cadre OXM.
Dependency Injection (DI): Tehnologia prin care Spring este cel mai des identificat dependency
injection (DI) un tip de inversiune de control (IoC). Inversiunea de control (IoC) este un concept
general i poate fi exprimat n mai multe moduri diferite i dependency injection este doar un
exemplu concret al inversiei de control.
Ce este injecia de dependen (dependency injection) mai exact? S ne uitm la aceste
dou cuvinte separat. Aici partea de dependen se traduce printr-o asociere ntre dou clase. De
exemplu, clasa X depinde de clasa Y. Acum, s ne uitm la partea a doua, injecie. Toate acestea
nseamn c Y va fi injectat n clasa X de IoC. Aici nu avem nevoie s scriem o mul ime de cod
pentru a crea instana claselor dependente. Injecia de dependen promoveaz cuplajul slab. Ea
deschide calea pentru nlturarea claselor de utilitate (utility clesses) pe care le scriem n
aplicaiile noastre.
2. Beneficiile n folosirea Spring
O aplicaie are clasa Drawing. n clasa Drawing exist o clas Shape care poate fi
Triangle sau Circle sau Rectangle.
Dependency with Constructor Injection
4. this.shape = shape;
5. }
6. }
Am eliminat controlul total al Drawing i l-am pstrat n alt parte (de ex. fi ier de configurare
XML) i dependena (de ex. clasa Shape) este injectat n clasa Shape printr-un Class
Constructor. Astfel, fluxul de control a fost "inversat" de Dependency injection (DI), deoarece am
delegat dependena la un sistem extern.
4. this.shape = shape;
5. }
6. }
A doua metod de injectare a dependenei este prin metoda Setter a clasei Drawing, unde vom
crea instana Shape i acest instan va fi folosit pentru a apela metode setter pentru a ini ializa
proprietatile clasei Drawing.
3. Folosirea Spring in Eclipse
Pasul 1 crearea unui proiect Spring simplu, folosind STS IDE. Urmai: File -> New -> Project
i selectai Spring Project din lista. Acum denumii proiectul ca spring01HelloWorld ca n
imaginea de mai jos:
Odat ce proiectul este creat cu succes, vom avea urmtorul coninut n project explorer:
La user library adugai spring-lib cu urmtoarele fiiere jar (acestea sunt minimele necesare):
antlr-runtime-3.0.2
org.springframework.aop-3.2.0.M1
org.springframework.asm-3.2.0.M1
org.springframework.aspects-3.2.0.M1
org.springframework.beans-3.2.0.M1
org.springframework.context.support-3.2.0.M1
org.springframework.context-3.2.0.M1
org.springframework.core-3.2.0.M1
org.springframework.expression-3.2.0.M1
commons-logging-1.1.1
HelloWorld.java
SpringTestApp.java
Atunci cnd aplicaia Spring este ncrcat n memorie, framework-ul utilizeaz fi ierul de
configurare de mai sus pentru a crea toate beans-urile definite i le atribuie un ID unic definit in
tag. Avei posibilitatea s utilizai tag-ul pentru a trece valorile diferitelor variabile folosite la
momentul crerii obiectului.
2. Application Context - Acest container adaug mai multe funcionaliti entreprise, cum ar fi
capacitatea de a rezolva mesajele textuale dintr-un fiier de proprieti i posibilitatea de a publica
evenimente de aplicaie pentru asculttori. Acest container este definit de interfaa
org.springframework.context.ApplicationContext.
6. BeanFactory n Spring
Un BeanFactory este ca o clas de fabric, care conine o colecie de beans. BeanFactory
deine definiiile pentru mai multe beans din cadrul su i apoi instaniaz beans-ul de cte ori
este solicitat de ctre clieni. BeanFactory este capabil de a crea asociatii intre obiecte care
colaboreaz in timp ce aceste obiecte sunt instaniate. Astfel, se elimin povara configuraiei
beans-ului n sine ct i a clienilor beans-ului.
BeanFactory ia parte, de asemenea, n ciclul de via al unui beans, efectuarea de apeluri la
metode de iniializare i distrugere a beans-urilor.
Acesta este cel mai simplu container care furnizeaz suport de baz pentru DI i este definit
de interfaa org.springframework.beans.factory.BeanFactory. BeanFactory i interfeele conexe,
cum ar fi BeanFactoryAware, InitializingBean, DisposableBean, sunt nc prezente n Spring cu
scopul de a asigura compatibilitatea cu numrul mare de framework-uri ale terilor care se
integreaz cu Spring.
n continuare prezentm un scurt exemplu pentru BeanFactory.
triangle.java
spring.xml
drawing.java
Primul pas este de a crea factory obiect unde am folosit framework API
XmlBeanFactory() pentru a crea factory bean i ClassPathResource () API pentru a ncrca
fiierul de configurare de beans disponibile n CLASSPATH. XmlBeanFactory() API are grij de
crearea i iniializarea tuturor obiectelor, de exemplu beans menionate n fiierul de configurare.
Al doilea pas este utilizat pentru a obine beansul necesar folosind metoda getBean() a
obiectului creat. Aceast metod utilizeaz beans ID-ul pentru a returna un obiect generic. Odat
ce avem obiectul, putem utiliza acest obiect pentru a apela orice metod de clas.
Dupa ce rulm clasa Drawing vom primi urmtoarea ieire pe consol:
7. ApplicationContext n Spring
ApplicationContext este un fel de frate mai mare al lui BeanFactory cu unele func ii
suplimentare, cum ar fi AOP concept, notificri eveniment i adaug mai multe funcionaliti
enterprise specifice, cum ar fi capacitatea de a rezolva mesajele textuale din fiier de proprieti i
posibilitatea de a publica evenimente de aplicaie. Acest container este definit de interfaa
org.springframework.context.ApplicationContext.
ApplicationContext include toate funcionalitile BeanFactory i este recomandat n
general naintea BeanFactory. BeanFactory poate fi utilizat n continuare pentru aplica ii simple,
cum ar fi cele pentru dispozitivele mobile sau aplicaii bazate pe applet.
Cele mai frecvent utilizate sunt implementari ApplicationContext sunt:
FileSystemXmlApplicationContext: Acest container ncarc definiiile beans dintr-un
fiier XML. Aici trebuie s furnizai calea complet a fiierului de configurare XML
beans pentru constructor.
ClassPathXmlApplicationContext: Acest container ncarc definiiile beans-urilor
dintr-un fiier XML. Aici nu trebuie s furnizai calea complet a fiierului XML, dar
trebuie s setai CLASSPATH n mod corespunztor, deoarece acest container va cuta
fiierul beans XML de configurare n CLASSPATH.
WebXmlApplicationContext: Acest container ncarc fiierul XML cu definiii ale
tuturor beans-urilor dintr-o aplicaie web.
triangle.java
spring.xml
drawingapp.java
n momentul n care vom rula exemplul de mai sus vom obine n consol urmtorul mesaj:
Equilateral Triangle Drawn.
8.Setter i Constructor Injection n Spring
Caracteristici:
Setter injection este preferat Constructor injection cnd amndou sunt
specificate.
Constructor nu poate iniializa parial valori.
Dependena circular poate fi obinut cu setter.
Securitatea este mai redus cu setter deoarece poate fi trecut peste.
Constructor asigur n totalitate dependena, setter nu o asigur n totalitate.
Setter poate fi citit mai uor.
Constructor Injection: Ideea de baza este faptul c obiectul nu are valori implicite i n
loc, avei un singur constructor unde toi colaboratorii i valorile trebuie s fie furnizate nainte de
a putea instania obiectul. Acum vom vedea un exemplu cu Constructor Injection:
triangle.java
Clasa bean triangle are dou atribute type i height. Cele dou atribute sunt setate utiliznd
constructor injection.
spring.xml
Atributul id al elementului bean este folosit pentru a specifica numele bean-ului i atributul
clasei este utilizat pentru a specifica numele de clasa al bean-ului. Elementul constructor-arg din
bean element este utilizat pentru a injecta valoarea proprietii prin injectare constructor.
Atributul index al elementului constructor-arg reprezint secvenele de argument constructor care
trec la constructorul clasei.
Precum:
Triangle(String type, int height)
la index = 0 argumentul este type;
la index = 1 argumentul este height;
i aa mai departe.
n cazul n care orice clas are un singur constructor argument, atunci nu exist nici o nevoie
pentru a specifica atributul index al bean in fisierul de configurare bean n Spring. Al doilea
atribut este de type constructor-arg este utilizat pentru tipul de argumentele constructorului.
Precum:
Triangle(String type, int height)
then type = "java.lang.String"
and type = "int"
Aici am stabilit "echilateral" i "20" pentru proprietile bean-ului triangle, tipul i nl imea
respectiv. Urmtoarea Main class este folosit pentru a obine Triangle bean din Spring IoC
container i de a afia valoarea sa in Triangle.
drawingapp.java
Rezultatul rulrii programului va fi in acest caz: Equilateral triangle is drawn of height 20.
Setter Injection: Utilizatorul obiectului poate apela setteri pe obiect pentru a trece peste
colaboratorii obiectului, n scopul de a lega obiectele mpreun sau pentru a nlocui colaboratori
cheie cu dubluri test.
triangle.java
Clasa bean Triangle are dou atribute type i height. Cele dou atribute sunt setate folosind
injectarea setter.
spring.xml
Atributul id al bean este folosit pentru a specifica numele bean-ului i atributul clasei
este utilizat pentru a specifica numele complet de clasa a bean-ului. Elementul property din bean
este utilizat pentru a injecta valoarea lui property prin injectare setter. Atributul name al property
reprezint atributul bean-ului i atributul value specific valoarea proprietii corespunztoare.
Aici am stabilit "echilateral" i "20" pentru Treaingle bean, tipul i nlimea respectiv.
Main class este folosit pentru a obine Triangle bean din IoC container i afia valoarea sa in
Triangle.
drawingapp.java
Rezultatul rulrii programului va fi in acest caz: Equilateral triangle is drawn of height 20.
n exemplele de mai sus, am fost vzut modul de a defini bean-ul (Triangle) n fiierul
de configurare (spring.xml) i de a iniializa proprietile sale asociate (de tip i nlime). n
exemplele anterioare am folosit numai tipurile primitive de date (int, long, double etc.) i clasa
java definite, cum ar fi cum ar fi String, Integer, etc (de exemplu, tipul este String si inaltimea
este int).
Acum vom un bean (Triangle), cu proprieti definite de utilizator (clasa Point).
Mai jos vom vedea un exemplu de injectare a obiectelor definite de utilizator in beans.
triangle.java
Clasa Triangle are trei puncte de noduri pentru a desena un triunghi i s defineasc
setter toate cele trei puncte pointA, pointB i pointC (numai setter este necesar n Spring
framework). Aici point este, de asemenea, o clas cu dou puncte, unul este axa X i altul este
axa Y.
point.java
Aici definim clasa Punct cu dou proprieti int x, int y. De fapt, clasa Point este, de
asemenea, un bean care este o proprietate a bean-ului Triangle. Acum vom configura ambele
beans cu fiierul de configurare (spring.xml).
spring.xml
Atributul id al bean-ului este folosit pentru a specifica numele bean-ului i atributul
class este utilizat pentru a specifica numele complet al clasei bean-ului. Property este utilizat
pentru a injecta valoarea proprietii prin injectare setter. Atributul name al elementului property
reprezint atributul bean-ului i atributul ref specific referina unei alte bean sau id al bean
element (Point) property.
Aici ne-am stabilit "pointA", "pointB" i "pointC" pentru bean-ul Triangle cu ref id al
altui bean (Point) "pointA", "pointB" i "pointC". Acum, "pointA" este id-ul elementului bean a
Point class i aa mai departe. Main class este folosit pentru a obine Triangle bean din Spring
IoC container i afia valoarea sa la Triangle.
Drawingapp.java
Beans interioare sunt beans interioare sunt beans definite n domeniul de aplicare al
unui alt bean. Oricnd un bean este folosit doar pentru o singur proprietate, este recomandat s-l
declarm ca un bean interior. Este suportat att de setter ct i de constructor.
n fiierul de configurare (spring.xml) exist patru beans (ID-uri sunt triangle, pointA,
pointB i pointC) definite n capitolul anterior. S presupunem c beans (pointB i pointC) din
clasa Point sunt folosite numai pentru definiia bean-ului triangle atunci nu este nevoie s
definim Point bean n mod separat n fiierul de configurare (spring.xml) i pointA este punctul
comun i este definit separat n fiierul de configurare bean (spring.xml). Cea mai bun idee n
aceast situaie trebuie s definim Point bean ca bean interioar cu n bean-ul Triangle.
Triangle.java Point.java
Acum, vom
vedea cum
s definim
beans ca
beans
interioare, n
urmtoarele
fiiere de
configurare:
Spring.xml
Drawingapp.java
1. Utilizarea Listei:
Doar cu valori:
Cu valori, beans si beans interior:
2. Utilizarea Set:
Doar cu valori:
4. Folosirea Properties:
Si acum sa vedem un exemplu:
Moduri Autowiring: Exist cinci moduri autowiring care pot fi folosite pentru a instrui
containerul Spring s utilizeze autowiring pentru injectare de dependen.
No implicit, nu definete autowiring
byName - autowiring se face prin numele proprietii. Spring se uit la
proprietile beans pentru care atributul autowire este setat la byName n fiierul
de configurare XML. Apoi, ncearc s se potriveasc i s lege proprietile sale
cu beans-urile definite de aceleai nume n fiierul de configurare.
byType autowiring se face prin potrivirea tipului de date de numele proprietii.
Spring se uit la proprietile beans-urilor pentru care autowire este setat la
byType n fiierul de configurare XML. Apoi, ncearc s se potriveasc o
proprietate n cazul n care tipul su se potrivete exact cu unul dintre numele
beans-ului n fiierul de configurare. n cazul n care exist mai mult de un astfel
de beans, genereaz fatal exception.
Constructor similar cu byType, dar tipul se aplic argumentelor pentru
constructor. n cazul n care nu exist exact un beans al tipului argumentului
constructorului n container, genereaz fatal error.
Autodetect - Atunci cnd constructorul implicit nu are nici un argument, autowire
n funcie de tipul de date sau autowire cu constructor. Spring ncearc s
foloseasc autowire constructor, n cazul n care nu funcioneaz, Spring va
ncearca s foloseasc byType.
Bean Scope nseamn c este utilizat pentru a decide ce tip de bean, ar trebui s fie
ntors de la Spring container napoi la apelant. Spring Bean Scopes de baz sunt doar dou tipuri
Singleton:(default) Scopes o singur bean definiie la un singur obiect instan per spring IoC
container. Prototype: o singur bean definiie pentru orice numr de instane de obiect.
Dar, n mediul web spring are inc trei scopes Request scope: la o solicitare HTTP.
Session Scope: la o sesiune HTTP. Global Session: o singur bean definiie pentru ciclul de via
al unei sesiuni HTTP globale.
Basic Spring Bean Scope - sunt doar dou tipuri prezentate mai jos.
1. Singleton Bean Scope - ntoarcere o singur instan a beans per spring IoC container
2. Prototype Bean Scope - ntoarcere o nou instan a bean-ului de fiecare dat cnd este
solicitat
Singleton Bean Scope - o singur definiie de beans ntr-un singur obiect instan per container
spring IoC. Acesta este comportamentul implicit al containerului spring.
Atunci cnd un beans este un singleton, numai o instan n comun a bean-ului va fi gestionat,
iar toate cererile pentru beans cu id sau id-uri care se potrivesc cu acel bean va avea ca rezultat
faptul c exact acea instan a bean-ului va fi returnat de ctre spring container.
Putem spune n alt mod, atunci cnd definii un bean i este scoped ca singleton, atunci spring
IoC container va crea exact o instan a obiectului definit prin aceast definiia a bean-ului.
Aceast singur instan va fi stocat ntr-un cache de astfel de Singleton beans i toate cererile
ulterioare i referine pentru acel beans va avea ca rezultat ntoarcerea obiectului din cache.
Pentru a defini un Singleton scope, putei seta proprietatea scope la Singleton n fi ierul de
configurare, aa cum se arat mai jos:
Point.java
Spring.xml
Drawingapp.java
Acest Singleton difer de modelul Singleton n Java Class. Modelul unic n Java
nseamn c putei crea o singur instan aunei clase n JVM. Dar, n spring Singleton bean
scope nseamn c fiecare container poate crea doar un singur bean n spring IoC container, dar
JVM poate avea mai multe Spring IoC Container astfel nct JVM poate avea mai multe beans,
mai degrab dect Singleton bean scope.
Prototype Bean Scope - ntoarcere o nou instan a bean-ului de fiecare dat cnd este solicitat
Point.java
Spring.xml
Drawingapp.java
Spring.xml
Point.java
Drawingapp.java
13. Folosirea ApplicationContextAware in Spring
Imaginai-v c avem o aplicaie (web sau swing, de exemplu) i dorim s fie activat -
Spring. Adaugm bibliotecile Spring (spring.jar) i fiierul de configurare (spring.xml) i crem
beans-urile. Dar exist nc unele fiiere de clas vechi pe care nu le putei utiliza n acest fel.
Aceste fiiere nc mai au nevoie de acces la Spring-Honeypot i nu dorim s modificm
aplicaia.
n primul rnd crem clasa "ApplicationContextProvider (clasa Triangle)". Aceast clas
implementeaz ApplicationContextAware. Un bean care implementeaz
ApplicationContextAware-interfa i este implementat n context, va fi apelat la crearea bean-
ului, folosind metoda interfetei setApplicationContext (...), i prevzut cu o trimitere la context,
care poate fi pstrat pentru o interaciune mai trziu cu contextul.
n acest tutorial vom vedea i exemplu de utilizare ApplicationContextAware.
ApplicationContextAware este utilizat atunci cnd un obiect este necesar.
Triangle.java
Point.java
Spring.xml
Drawingapp.java
Cu rezultatul rulrii programului:
Bean name is: triangle
PointA is (0, 0)
PointB is (-20, 0)
PointC is (20, 0)
Motenirea Spring Bean nu are nimic de-a face cu motenirea de clas Java, dar
conceptul de motenire este acelai. Putei defini o definiie un bean printe ca un ablon i beans
copii pot moteni configuraia necesar din bean printe.
Exemplul urmtor ilustreaz motenirea beans cu clasa triangle i clasele sale prini.
Triangle.java
Point.java
Urmtorul este fiierul de configurare spring.xml n care am definit "parentTriangle" bean, care
are o proprietate "pointA". n continuare, exist dou beans "triangle1" i "triangle2" care au fost
definite ca un copil al "parentTriangle" bean cu ajutorul atributului parent. Copilul bean
motenete proprietatea"pointA" ca atare i are prioritate fa de proprietatea "pointA" i
introduce nc dou proprieti "pointB" i "pointC.
Spring.xml
Drawingapp.java
Rezultatul rulrii aplicaiei va fi:
PointA is (0, 0)
PointB is (-20, 0)
PointC is (20, 0)
Observm aici c nu am trecut de "pointA", cnd am creat bean-ul "triangle1", dar am trecut din
cauza motenirii definiiei bean-ului.
Spring ofer mai multe metode de reapelare a bean-ului creat i unele metode pentru a fi
distruge bean-ul.
Spring framework ofer mai multe interfee marker pentru a schimba comportamentul
bean-ului n container; ele includ InitializingBean i DisposableBean. Punerea n aplicare a
acestor interfee va face containerul s apeleze afterPropertiesSet () pentru prima i destroy (),
pentru a doua, pentru a permite beanului s efectueze anumite aciuni asupra ini ializrii i
distrugerii.
Ciclul de via al unui bean spring este uor de neles. Atunci cnd un bean este
instaniat, acesta poate fi obligat s efectueze o anumit iniializare pentru a-l aduce ntr-o stare
utilizabil. n mod similar, atunci cnd bean-ul nu mai este necesar i este scos din container,
poate fi necesar curarea.
Beans poate fi notificat dup creare i toate proprietile sunt setate i nainte ca
acestea s fie distruse i ndeprtate din containerul pentru beans. Acest lucru implic specificarea
metodei de reapelare care urmeaz s fie invocat de container. Acest lucru se face n XML prin
specificarea atributelor metoda-init = "myinit", pentru apel invers de iniializare, i metoda-
destroy = "mydestroy", pentru a distruge. "Myinit" i "cleanUp" sunt nume de metode de
exemplu, n clasa bean.
Apelarea de iniializare
Acum putem pune n aplicare interfaa de mai sus i de a face unele funcionalit i de
iniializare cu aceast metod. Ca mai jos:
Acum putem pune n aplicare interfaa de mai sus i de a face unele distruge unele
funcionaliti cu aceast metod. Ca mai jos:
n general, utilizarea interfeei DisposableBean poate fi evitat (i este descurajat din moment ce
cupleaz inutil codul de Spring). O definiie de bean ofer suport pentru o metod generic de
distrugere care urmeaz s fie specificat. Atunci cnd se utilizeaz metadate de configurare
bazate pe XML, acest lucru se face prin intermediul atributului "destroy-method"
i acum un exemplu:
Triangle.java
Point.java
Spring.xml
Drawingapp.java
Adnotarea se efectueaz nainte de injectarea prin XML, prin urmare, aceasta din urm
o va suprascrie pe prima pentru proprietile legate prin ambele abordri.
Element: annotation-config
Activeaz diverse adnotri pentru a fi detectate n clase beans: @Required i
@Autowired, precum i JSR 250 @PostConstruct, @PreDestroy i @Resource (dac este
disponibil), JAX-WS @WebServiceRef (dac este disponibil), @EJB EJB3 (dac este
disponibil) i JPA @PersistenceContext i @PersistenceUnit (dac este disponibil). Ca
alternativ, putei alege s activai BeanPostProcessors individuale pentru aceste adnotri.
S vedem cteva adnotri importante pentru a nelege modul n care acestea funcioneaz:
Adnotarea @Required:
Descriere: adnotarea @Required este utilizat pentru a specifica faptul c valoarea unei
proprieti a bean-ului este necesar pentru a fi injectat dependen a. Asta nseamn c, o eroare
este cauzat n cazul n care o valoare nu este specificat pentru proprietatea respectiv.
Adnotarea @Autowired:
Descriere: @Autowired pot fi folosite i pentru "dependen ele rezolvabile": interfaa
BeanFactory, interfaa ApplicationContext, interfaa ResourceLoader, interfaa
ApplicationEventPublisher i interfaa MessageSource.
Adnotarea @Qualifier:
Descriere: pot exista situaii cnd creai mai mult de un beans de acela i tip i dori i s
legai doar unul dintre ele cu o proprietate, n acest caz, putei utiliza adnotarea @Qualifier
mpreun cu @Autowired pentru a elimina confuzia prin specificarea exact a bean-ului ce va fi
legat.
Adnotarea @Aspect:
Descriere: pentru a utiliza aspecte @AspectJ ntr-o configuraie Spring trebuie s
activai suportul Spring pentru AOP bazat pe aspectele @AspectJ i autoproxying beans. Prin
autoproxying nelegem c dac Spring stabilete c un bean este recomandat de ctre unul sau
mai multe aspecte, aceasta va genera automat un proxy pentru acel bean pentru a intercepta
metoda invocri i s se asigure c este executat n funcie de necesiti.
Adnotrile JSR-250
int: metode setter i non setter
Descriere: Spring suport adnotri JSR-250 care includ @Resource, @PostConstruct i
@PreDestroy. JSR 250, ca o Java Specification Request, are obiectivul de a defini un set de
adnotri care abordeaz concepte semantice comune i, prin urmare, pot fi folosite de mai multe
componente de Java EE i Java SE. Acest lucru este de a evita adnotri redundante peste aceste
componente. JSR 250 a fost lansat pe data de 11 05 2006. Ca o configuraie bazat pe adnotare
declarativ este mai mult folosit n framework i aplicaii Java, de exemplu Spring face mai multe
componente ale framework-ului su configurabil prin intermediul adnotrilor, importana JSR
250 este probabil s creasc n viitor.
Adnotrile Stereotipe
int: Clase marcate cu adnotri stereotip
Descriere: Clasele marcate cu adnotri stereotip sunt candidati pentru auto-detecie de
Spring atunci cnd se utilizeaz configuraie bazat pe adnotare i scanare classpath.
Adnotarea @Component este stereotipul principal care indic faptul c o clas adnotat
este o "component".
Adnotarea @Service este folosit pentru a decora clasa legate de punerea n aplicare a
serviciilor este o form specializat a adnotrii @Component.
Adnotarea @Repository este nc un alt stereotip, care a fost introdus n Spring 2.0. O
clas care servete n stratul de persistena cererii ca obiect de acces la date (DAO), altfel
cunoscut ca un depozit n alte tehnologii.
@Controller O component controler n stratul de prezentare a cererii, care se refer la
o aplicaie proiectat MVC.
Circle.java
Point.java
Spring.xml
Drawingapp.java
Circle.java
Circle.java
Circle.java
18. Spring JSR-250 adnotri
Adnotri JSR-250 care includ @PostConstruct, @PreDestroy i adnotri @Resource.
JSR-250 adnotri sau adnotri comune pentru platforma Java au fost introduse ca parte a Java EE
5 i sunt folosite de obicei pentru adnotri EJB3.
@PostContruct - Aceast adnotare este aplicat la o metod pentru a indica faptul c trebuie
invocat dup ce injecia de dependena este complet.
@PreDestroy - Aceasta se aplic la o metod pentru a indica faptul c trebuie invocat nainte ca
bean-ul s fie scos din contextul Spring, adic exact nainte de a fi distrus.
@Resource - Aceasta dubleaz funcionalitatea @Autowired combinat cu @Qualifier i ve i
obine avantajul suplimentar de a fi capabil de a numi care bean este injectat, fr a fi nevoie de
dou adnotri.
Adnotarea @Resource:
int: clasa component, sau cmpuri sau metode ale clasei componente.
: adnotarea @Resource marcheaz o resurs necesar de aplicaie. Aceast adnotare
poate fi aplicat la o clas de componente aplicaii, sau cmpuri sau metode ale clasei
componente. Cnd adnotarea este aplicat la un cmp sau metod, containerul va injecta o
instan a resursei solicitate n componenta aplicaiei atunci cnd componenta este iniializat. n
cazul n care adnotarea este aplicat clasei componente, adnotarea declar o resurs pe care
aplicaia o va cuta n timpul rulrii.
n cazul n care nu este specificat un nume explicit, atunci numele implicit va fi derivat
din numele cmpului sau metoda setter: In cazul unui cmp, acesta va fi pur i simplu echivalent
cu numele cmpului; n cazul unei metode setter, acesta va fi echivalent cu numele propriet ii
bean-ului. Aa c exemplul urmtor va avea bean-ul cu numele "center" injectat n metoda setter:
i acum un exemplu:
Circle.java
Point.java
Spring.xml
Drawingapp.java
Adnotarea @PostContruct:
int: Metode ale clasei componente.
Descriere: Adnotarea @PostConstruct este utilizat pe o metod care trebuie s fie executat
dup ce se face injecia de dependen pentru a efectua orice iniializare. Aceast metod trebuie
s fie invocat n faa clasei este pus n funciune. Aceast adnotare trebuie s fie suportat pe
toate clasele care suport injectarea de dependena. Metoda adnotat cu @PostConstruct trebuie
s fie invocat chiar i n cazul n care clasa nu solicit resurse pentru ca s fie injectat. Doar o
singur metod poate fi adnotat cu aceast adnotare. Metoda pe care se aplic adnotare
@PostConstruct trebuie s ndeplineasc toate criteriile urmtoare - metoda nu trebuie s aib
parametri, cu excepia cazului interceptoarelor EJB, n cazul n care este nevoie de un obiect aa
cum Invocation Context definit prin caietul de sarcini EJB. - Tipul de retur al metodei trebuie s
fie nul. - Metoda nu trebuie s arunce o excepie verificat. - Metoda pe care se aplic
@PostConstruct pot fi publice, protejate, pachetul privat sau privat. - Metoda nu trebuie sa fie
static, cu excepia clientului aplicaiei. - Metoda poate fi definitiv. - n cazul n care metoda
arunc o excepie neverificat, clasa nu trebuie s fie pus n funciune, cu excep ia, n cazul n
care EJB-urile se pot ocupa de excepii i chiar se pot recupera.
Adnotarea @PreDestroy:
int: Metode ale clasei componente.
Descriere: Adnotarea @PreDestroy este utilizat pe metode ca o notificare de apel invers pentru a
semnala c instana este n curs de a fi ndeprtat de container. Metoda adnotat cu @PreDestroy
este de obicei folosit pentru a elibera resursele pe care le-a folosit. Aceast adnotare trebuie s
fie susinut de ctre toate obiectele container gestionate care accept @PostConstruct cu
excepia containerului client aplicaie n Java EE 5. Metoda pe care se aplic adnotare
@PreDestroy trebuie s ndeplineasc toate criteriile urmtoare - - Metoda nu trebuie s aib
parametri cu excepia cazului interceptoarelor EJB, n cazul n care este nevoie de un obiect
InvocationContext astfel cum este definit n specificaia EJB. - Tipul de retur al metodei trebuie
s fie nul. - Metoda nu trebuie s arunce o excep ie verificat. - Metoda pe care se aplic
PreDestroy pot fi publice, protejate, pachet privat sau privat. - Metoda nu trebuie s fie static. -
Metoda poate fi definitiv. - n cazul n care metoda arunc o excepie neverificat este ignorat,
cu excepia, n cazul n care EJB-urile se pot ocupa de excepii.
n cele ce urmeaz vom prezenta un exemplu pentru adnotrile @PostConstruct and
@PreDestroy n JSR-250 cu Spring:
Circle.java
Point.java
Drawingapp.java
n mod implicit, Spring nu va fi contient de adnotare @PostConstruct i @PreDestroy.
Pentru a-l activa, trebuie s nregistrm "CommonAnnotationBeanPostProcessor" sau
specificm <context: / annotation-config/> n fiierul de configurare al bean (spring.xml).
Folosind CommonAnnotationBeanPostProcessor
Circle.java
Point.java
MyEventListener.java
DrawEvent.java
Spring.xml
Drawingapp.java
In acest cele ce urmeaz vom discuta despre JDBC Framework Spring. n vechiul
JDBC API, cnd lucrm cu baza de date utiliznd framework-ul JDBC vechi, atunci trebuie s
avem grij de o mulime de responsabiliti sau devine greoi s scriem cod inutil care s se ocupe
de excepii, de deschidere i nchidere a conexiunilor bazei de date, etc. Spring JDBC Framework
are grij de toate detaliile de nivel de baz pornind de la deschiderea conexiunii, s pregteasc i
s execute instruciunea SQL, excepiile de proces, tratarea tranzaciilor i n cele din urm
nchide conexiunea.
Deci, ce avem fcut este doar s definim parametrii de conexiune i specificm
instruciunea SQL care urmeaz s fie executate i de a face munca necesar pentru fiecare
iteraie n timp ce preia datele din baza de date.
Spring ofer template-uri JDBC pentru a accesa datele din baza de date cu uurin .
Spring prevede org.springframework.jdbc.core.JdbcTemplate care preia atribuiile de stabilire a
conexiunii la baza de date.
Spring JDBC Frramework prevede mai multe abordri i n mod corespunztor, clase
diferite pentru interfaa cu baza de date.
Spring Framework JDBC este format din patru pachete diferite, i anume core,
dataSource, object i support.
JdbcTemplate
Clasa JdbcTemplate este clasa central n pachetul de baz JDBC. Aceasta simplific
utilizarea JDBC, deoarece ea se ocup de crearea i eliberarea de resurse. Acest lucru ajut pentru
a evita erorile comune, cum ar fi uitarea de a nchide ntotdeauna conexiunea. Execut fluxul de
lucru JDBC de baz cum ar fi crearea de declaraii i de execuie, lsnd codul de aplicaie pentru
a furniza SQL i a extrage rezultatele. Aceast clas execut interogri SQL, instruc iunile de
actualizare sau apelurile de proceduri stocate, imitnd iterarea peste ResultSet i extragerea
valorilor parametrilor returnai. De asemenea, ea prinde excepii JDBC i le traduce n genericele
i mai informative excepii, definite n pachetul org.springframework.dao.
Codul folosind JdbcTemplate are nevoie doar pentru a pune n aplicare interfee de apel,
oferindu-le un contract clar definit. Interfaa de apel PreparedStatementCreator creeaz o
declaraie pregtit pentru o anumit conexiune prevzut de aceast clas, oferind SQL i orice
parametri
necesari.
Acelai lucru este valabil i pentru interfaa CallableStatementCreator care creeaz
declaraii apelabile. Interfaa RowCallbackHandler extrage valorile din fiecare rnd al unui
ResultSet.
JdbcTemplate poate fi utilizat ntr-o punere n aplicare DAO prin instanierea direct cu
o referin DataSource, sau poate fi configurat ntr-un container Spring IoC i dat DAO ca o
referin de bean.
Not: DataSource trebuie s fie ntotdeauna configurat ca un bean n containerul Spring
IoC, n primul caz dat serviciul direct, n al doilea caz la template-ul pregtit.
Not: Instanele clasei JdbcTemplate sunt threadsafe o dat configurate. Astfel nct s
putei configura o singur instan a unui JdbcTemplate i apoi se poate injecta n siguran
aceast referin partajat n mai multe DAO.
Empdao.java
EmployeeDaompl.java
EmployeeMapper.java
Spring.xml
Stil JdbcTemplate:
Stil SimpleJdbcTemplate:
SimpleJdbcInsert i SimpleJdbcCall
Configurarea DataSource
Spring obine o conexiune la baza de date printr-o DataSource. O sursa de date este o
parte din specificaiile JDBC i este o fabric de conexiune generalizat. Acesta permite unui
container sau a unui framework s ascund problemele de punere n comun de conectare i de
gestionare a tranzaciei din codul aplicaiei. Ca dezvoltator, nu avei nevoie s ti i detalii despre
modul n care se conecteaz la baza de date; aceasta este responsabilitatea administratorului care
stabilete DataSource. Cel mai probabil avei ambele roluri pe msur ce se dezvolt aplica ia i
se testeaz, dar nu trebuie neaprat s tii cum este configurat sursa de date de producie.
Atunci cnd se utilizeaz stratul JDBC Spring, obinei o surs de date de la JNDI sau
v configurai conexiune furnizat de ctre o ter parte. Implementrile populare sunt Apache
Jakarta Commons DBCP i C3P0. Implementrile n distribuia Spring sunt destinate numai
pentru scopuri de testare i nu ofer punerea n comun.
Acum, s vedem cum crem un tabel Employee n baza de date DAVDB. Presupunem
c lucrai cu baza de date MySQL, n cazul n care lucrai cu orice alt baz de date, atunci pute i
schimba DDL i interogrile SQL n mod corespunztor.
Acum avem nevoie de a furniza o DataSource la JdbcTemplate astfel nct s se poate
configura pentru a obine acces la baze de date. Aici este un exemplu de modul n care se
configureaz un DriverManagerDataSource n cod Java.
DBCP configurare:
C3P0 configurare:
DAO s-ar traduce prin obiect de acces la date, care este frecvent utilizat pentru
interaciunea bazei de date. DAO exist pentru a furniza un mijloc de a citi i a scrie date la baza
de date i acestea ar trebui s expun aceast funcionalitate printr-o interfa prin care restul
aplicaiei le va accesa.
Suportul DAO n Spring va face uor modul de a lucra cu tehnologii de acces la date,
cum ar fi JDBC, Hibernate, JPA sau JDO ntr-un mod coerent.
Aceasta este n primul rnd o clas de test. De exemplu, acesta permite testarea u oar a codului
n afara unui server de aplicaii, mpreun cu un mediu JNDI simplu. Spre deosebire de
DriverManagerDataSource, se reutilizeaz aceeai conexiune tot timpul, evitnd crearea de
excesiv a conexiunilor fizice.
Aceast implementare este util pentru testare i medii stand-alone n afara unui container Java
EE, fie ca un bean DataSource ntr-un container Spring IOC, sau n combinaie cu un mediu JNDI
simplu. Apelul Connection.close() va nchide pur i simplu conexiunea, astfel nct orice cod de
persistenta DataSource ar trebui s funcioneze. Cu toate acestea, folosind pool-uri de conectare
de tip JavaBean, cum ar fi commons-dbcp este att de uor, chiar i ntr-un mediu de test, c este
aproape ntotdeauna de preferat s se foloseasc o astfel de conexiune peste
DriverManagerDataSource.
DataSourceTransactionManager: Clasa DataSourceTransactionManager este o implementare
PlatformTransactionManager pentru un singur datasources JDBC. Acesta leag o conexiune
JDBC de la sursa de date specificat la firul de executare n prezent, poten ial pentru a permite o
conexiune pentru fiecare surs de date.
Un manager de tranzacie este acea parte a unei cereri, care este responsabil pentru
coordonarea tranzaciilor peste una sau mai multe resurse. n Spring, managerul de tranzacie este
efectiv rdcina sistemului de tranzacii. Prin urmare, dac dorii s activai tranzac iile unei
componente n Spring, creai de obicei un beans manager de tranzacie i trece-l la component.
Managementul de gestionare a tranzaciei este esenial n orice form de aplicaii care
vor interaciona cu baza de date.
O tranzacie n baz de date este o secven de aciuni, care sunt tratate ca o singur
unitate de lucru. Aceste aciuni ar trebui s fie completate n totalitate sau s nu aib niciun efect.
Transaction Management este o parte important a RDBMS orientate spre aplicatii enterprise
pentru a asigura integritatea i coerena datelor. Conceptul de tranzacie poate fi descris cu
urmtoarele patru proprieti eseniale descrise ca ACID:
Atomicitate: O tranzacie trebuie s fie tratat ca o singur unitate de operare, ceea ce
nseamn c fie ntreaga secven de operaii se realizeaz cu succes sau nereuit.
Consisten: Aceasta reprezint coerena integritii refereniale a bazei de date, cheile
primare unice n tabele, etc.
Izolarea: Pot exista mai multe tranzacii de prelucrare cu aceleai date stabilite n acela i
timp, fiecare tranzacie ar trebui s fie izolate de alte persoane pentru a preveni coruperea
datelor.
Durabilitate: Odat ce o tranzacie s-a finalizat, rezultatele acestei tranzac ii trebuie s fie
permanente i nu pot fi terse din baza de date din cauza defectrii sistemului.
O tranzacie simpl este de obicei emis pentru sistemul de baze de date ntr-un limbaj
cum ar fi SQL n aceast form:
1. ncepe tranzacia
2. Executa mai multe interogri (dei orice actualizri ale bazei de date nu sunt de fapt
vizibile pentru lumea exterioar nc)
3. Se angajeaz tranzacia (actualizri devin vizibile n cazul n care tranzacia este de
succes)
Spring framework ofer un strat abstract pe partea de sus a diferitelor API-uri care stau
la baza de management al tranzaciei. Suportul Spring pentru tranzacie i propune s ofere o
alternativ la tranzaciile EJB prin adugarea de capabiliti de tranzacionare la POJOs. Spring
susine att managementul programatic ct i cel declarativ al tranzac iei. EJBs necesit un server
de aplicaii, dar gestiunea tranzaciilor n Spring poate fi pus n aplicare fr a fi nevoie de
server de aplicaii.
Managementul tranzaciei locale poate fi util ntr-un mediu de calcul centralizat, n cazul n care
componentele i resursele aplicaiei sunt localizate ntr-un singur site, iar gestiunea tranzaciilor
implic doar un manager de date locale care ruleaz pe o singur main. operaiunile locale sunt
mai uor de pus n aplicare.
Managementul tranzaciilor la nivel global este necesar ntr-un mediu de calcul distribuit n
cazul n care toate resursele sunt distribuite pe mai multe sisteme. ntr-o astfel de tranzac ie de
gestionare de caz trebuie s se realizeze att la nivel local ct i la nivel global. O tranzac ie
global distribuit este executat pe mai multe sisteme, iar executarea acestuia necesit o
coordonare ntre sistemul de management al tranzaciei la nivel global i toi managerii de date
locale ale tuturor sistemelor implicate.
EmpMainApp.java
Spring.xml
n aceast metod, ai atepta ca inseria s fie angajat la baza de date? Rspunsul este
da, dei acest lucru nu este comportamentul dorit. Comportamentul implicit al JDBC este
autocommit = true, ceea ce nseamn c, fiecare inserie sau actualizare este efectuat imediat. Ai
putea seta autocommit = false i explicit comitarea sau derularea napoi la sfritul metodei. Dar
este mult mai uor s lsai containerul se ocupe de acest lucru.
Pentru a aduga gestiunea tranzaciilor declarative la metoda de mai sus utilizai
urmtorii pai:
EmpDAO.java
EmployeeDaoImpl.java
Employee.java
EmployeeMapper.java
EmpMainApp.java
Spring.xml
22. Folosirea Hibernate cu Spring
Hibernate este o tehnologie puternic pentru persistena datelor n orice tip de aplicaie.
Spring, pe de alt parte, este un cadru de injec ie de dependen care suport IoC. Frumuse ea
Spring este c se poate integra bine cu cele mai multe dintre tehnologiile cele mai populare.
Una dintre problemele folosirii Hibernate este c aplicaia client care acceseaz baza de date
folosind Hibernate trebuie s depind de API-uri Hibernate, cum ar fi Configuration,
SessionFactory i Session. Aceste obiecte vor continua s fie mprtiate n codul aplicaiei. Mai
mult dect att, codul aplicaiei trebuie s menin manual i s gestioneze aceste obiecte. n
cazul Spring, obiectele pot fi extrem de configurabile cu ajutorul IoC Container. Starea unui
obiect poate fi externalizat din codul de aplicaiei. Aceasta nseamn c acum este posibil s se
utilizeze obiectele Hibernate ca Spring Beans i se pot bucura de toate facilit ile pe care le ofer
Spring.
EmployeeDaoImpl.java
5. Crearea de clasei de aplicaie