Title: Spring
1 2Plan wykladu
- Co to jest Spring?
- JavaBeen i wstrzykiwanie zaleznosci
3Historia Spring
- J2EE jest zbyt skomplikowane,
- encyjne EJB sa przestarzale, zlozone, naduzywane
i prawie zbedne, - lepiej wykorzystywac interfejsy niz
dziedziczenie, - komponenty JavaBean doskonale sie nadaja do
tworzenia aplikacji, - paradygmat obiektowy jest wazniejszy niz
implementacja, - obslugiwane wyjatki sa naduzywane w aplikacjach
Java, - kluczowa role pelni mozliwosc niezaleznego
testowania poszczególnych modulów.
4Co to jest Spring
- Wielowarstwowy szkielet aplikacji Java/J2EE
zawierajacy - lekki kontener umozliwiajacy scentralizowane
zarzadzanie i laczenie komponentów JavaBean i
POJO, - warstwe zarzadzania transakcjami,
- warstwe obslugi JDBC,
- moduly umozliwiajace integracje z Toplink,
Hibernate, JDO i iBATIS za pomoca standardowych
DAO, - pelnowartosciowe srodowisko obslugujace
paradygmat programowania aspektowego AOP, - elastyczne srodowisko do tworzenia aplikacji
internetowych zgodnie z modelem MVC umozliwiajace
integracje ze Struts, WebWork,Tapestry
5Architektura Spring (I)
- Spring jest uzupelnieniem serwerów aplikacji
- caly szkielet tworzony z perspektywy aplikacji a
nie serwera - Pelna modulowosc szkieletu
- mozna wykorzystac dowolna czesc Spring
niezaleznie od pozostalych - Wysoka konfigurowalnosc projektów
- Nie uzalezniamy kodu aplikacji od naszego API
6Architektura Spring (II)
7Skladniki Spring (I)
- Kontener
- podstawowa czesc architektury, glównym
skladnikiem jest BeanFactory zapewniajaca
mechanizm IoC (Inversion of Control) - Spring context
- plik konfiguracyjny dostarczajacy opis
srodowiska JNDI, EJB, wielojezycznosc,
walidacja, itp. - SpringAOP
- modul implementujacy mechanizm AOP
(Aspect-Oriented Programming) i zapewniajacy
transakcyjnosc przetwarzania
8Skladniki Spring (II)
- SpringDAO
- hierarchia wyjatków ujednolicajaca kody bledów
róznych baz danych - Spring ORM
- szablony ulatwiajace korzystanie z narzedzi ORM
- Spring Web module
- integracja z Jakarta Struts i dostarczanie
kontekstu aplikacjom webowym - SpringMVC framework
- implementacja MVC obslugujaca szeroka game
technologii
9Podstawowe zalozenia
- Uzywamy POJO (plain old java object)
- Framework dostarcza kontener dla obiektów
- Framework zarzadza tworzeniem obiektów
- Wiekszosc naszego kodu "nie wie" o istnieniu
kontenera - Duza elastycznosc i konfigurowalnosc (silny XML!)
- Integracja i unifikacja dostepu do zewnetrznych
zasobów i technologii (np. Baz danych) - Projektowanie i programowanie przez interfejsy
10Spring Bean
- Wszystko jest beanem!
- Beany to dowolne obiekty zarzadzane przez
kontener Springa. - Beany nie musza implementowac zadnego interfejsu,
ani rozszerzac zadnej klasy - Beany zazwyczaj produkowane sa przez fabryke
Springa. - Beany definiujemy w kontekscie aplikacji za
pomoca XML lub properties, kodu Javy lub innych
metod.
11Deklaracja Bean
- Kazdy bean ma unikalny identyfikator i klase.
- Ponizsza deklaracja XML definiuje najprostszy
bean - ltbean id"prostyBean" class"spring.Bean" /gt
12Atrybuty Bean
- Najwazniejsze atrybuty beanow deklarowane w XMLu
- id - identyfikator beana
- class - klasa beana
- abstract - czy jest to bean abstrakcyjny
- autoWire - autoinjectowanie
- singleton - czy bean jest singletonem
- parent - nadklasa beana
- init-method - metoda wywolywana przy inicjacji
- lazy-init - czy inicjacja ma byc leniwa
- destroy-method - metoda wywolywana przy
niszczeniu beana
13Wstrzykiwanie zaleznosci
- Uzytkownik nie tworzy i nie laczy obiektów w
aplikacji, lecz opisuje zaleznosci miedzy
poszczególnymi klasami. Kontener jest w pelni
odpowiedzialny za tworzenie obiektów i ich
laczenie - Metody implementacji wzorca IoC
- obiekty implementuja specjalny interfejs do
wyszukiwania obiektów zaleznych - zaleznosci sa ustawiane w obiektach przez metody
setter - zaleznosci sa ustawiane w obiektach przez
konstruktor
14Wstrzykiwanie zaleznosci przez settery (I)
- public class PrzykladowyBean
- private FirstBean beanOne
- private SecondBean beanTwo
- private int i
- public void setBeanOne(FirstBean beanOne)
- this.beanOne beanOne
- public void setBeanTwo(SecondBean beanTwo)
- this.beanTwo beanTwo
- public void setIntegerProperty(int i)
this.i i
15Wstrzykiwanie zaleznosci przez settery (II)
- ltbean id" przykladowyBean" classprzyklady.
PrzykladowyBean"gt - ltproperty name"beanOne ref beanfirstBean"/gt
- lt/propertygt
- ltproperty name"beanTwo" refsecondBean"/gt
- ltproperty name"integerProperty" value"1"/gt
- lt/beangt
- ltbean idfirstBean" classprzyklady.FirstBean"/gt
- ltbean idsecondBean" classprzyklady.SecondBean"
/gt
16Wstrzykiwanie zaleznosci przez konstruktor (I)
- public class PrzykladowyBean
- private FirstBean beanOne
- private SecondBean beanTwo
- private int i
-
- public PrzykladowyBean(
- FirstBean firstBean, SecondBean
secondBean, int i) - this.beanOne firstBean
- this.beanTwo secondBean
- this.i i
-
17Wstrzykiwanie zaleznosci przez konstruktor (II)
- ltbean idprzykladowyBean" classprzyklady.Przykl
adowyBean"gt - ltconstructor-arggt
- ltref beanfirstBean"/gt
- lt/constructor-arggt
-
- ltconstructor-arg refsecondBean"/gt
- ltconstructor-arg type"int" value"1"/gt
- lt/beangt
- ltbean idfirstBean" classprzyklady.FirstBean"/gt
- ltbean idsecondBean" classprzyklady.SecondBean"
/gt
18Inicjalizacja Bean
- ltbean id"msg" class"spring.msg"gt
- ltproperty name"message" value"Hello" /gt
- ltproperty name"names"gt
- ltlistgt
- ltvaluegtMareklt/valuegt
- ltvaluegtAnnalt/valuegt
- ltvaluegtJanlt/valuegt
- ltvaluegtEwalt/valuegt
- lt/listgt
- lt/propertygt
- ltproperty name"number" value"13" /gt
- lt/beangt
19Inicjalizacja Bean - przyklad (I)
- class Pokoj
- String nazwa
- String lokalizacja
- ....
-
- class Uzytkownik
- String imie
- Pokoj pokoj
- ....
20Inicjalizacja Bean - przyklad (II)
- ltbeansgt
- ltbean iduzytkownikBean" class"spring.Uzytkownik
"gt - ltproperty nameimie" value"Marek"/gt
- ltproperty namepokoj ref beanpokojBean"/gt
- lt/propertygt
- lt/beangt
- ltbean idpokojBean" class"spring.Pokoj" gt
- ltproperty namenazwa" value27C"/gt
- ltproperty namelokalizacja" valueB2"/gt
- lt/beangt
- lt/beansgt
21Metoda inicjalizacyjna
- Istnieje mozliwosc wskazani wlasnych metod do
inicjalizacji oraz destrukcji beana. - public class Foo
- private boolean initialized false
- public void init()
- initialized true
-
-
- ltbean id"fu" class"Foo" init-method"init" /gt
22Niszczenie Bean
- public class Foo
- private boolean initialized false
- public void dest()
- initialized true
-
-
- ltbean id"fu" class"Foo" destroy-method"dest"
/gt
23Fabryki komponentów (I)
- Podstawowa funkcjonalnosc Spring jest
udostepniana przez pakiet org.springframework.bean
s. Pakiet zawiera infrastrukture umozliwiajaca
wyszukiwanie i wiazanie komponentów JavaBean. - BeanFactory to glówna fabryka dostarczajaca
komponentów JavaBean i zarzadzajaca tworzeniem i
wiazaniem komponentów, - ApplicationContext to interfejs rozszerzajacy
BeanFactory o obsluge komunikatów i
internacjonalizacji, obsluge zdarzen i mozliwosc
rejestrowania nasluchu zdarzen
24Fabryki komponentów (II)
- Spring nie naklada na klasy POJO zadnych
dodatkowych wymagan dotyczacych rozszerzanych
klas lub implementowanych interfejsów - Dwa tryby tworzenia komponentów
- singleton fabryka tworzy jedna instancje
komponentu JavaBean o podanej nazwie, wszystkie
zadania wspóldziela jeden komponent, - prototype w odpowiedzi na kazde zadanie fabryka
tworzy nowa instancje komponentu JavaBean. - Fabryki dostarczaja mechanizmu zarzadzania cyklem
zycia komponentu, interfejsy InitializingBean i
DisposableBean umozliwiaja podejmowanie
okreslonych akcji podczas tworzenia i niszczenia
komponentu
25Fabryki komponentów (III)
- Sprawdzenie czy bean ma jakies zaleznosci. Jesli
ma to trzeba je stworzyc lub pobrac ich
instancje, jesli juz zostaly stworzone wczesniej. - Wywolanie konstruktora lub statycznej metody z
fabryki, aby dostac instancje. - Ustawienie wartosci pól poprzez setter zgodnie
z definicja w XMLu. - Wywolanie metody inicjalizacyjnej (jesli ja
zdefiniowano).
26Zasieg Bean
- Singleton(domyslny)
- Jedna instancja na kontener
- Prototype
- Kazde zadanie tworzy nowa instancje
- Request
- Session
- Global Session
- ltbean id"kontroler" class"Foo"
scope"singleton" /gt - ltbean iddao" classBar" scope"prototype /gt
- ltbean id"stan" class"Session" scope"session" /gt
27Leniwa inicjalizacja
- Domyslnie Spring inicjuje wszystkie pola w
momencie tworzenia obiektu. Mozna ustawic, zeby
bean byl inicjowany dopiero w momencie odwolania
sie do niego. - ltbean lazy-inittrue ... /gt
28Przykladowy Bean dla kontrolera (I)
- ltbean id"uzytkownikRekordController"
class"controller.security.UzytkownikRekordControl
ler"gt - ltproperty name"uzytkownikService"
ref"uzytkownikService" /gt - ltproperty name"urzadzenieService"
ref"urzadzenieService/gt - ltproperty name"propertyEditorRegistrar"
refuzytkownikPropertyEditorRegistrar"/gt - ltproperty name"pages"gt
- ltlistgt
- ltvaluegtuzytkownik00Danelt/valuegt
- ltvaluegtuzytkownik01Lokalizacjalt/valuegt
- ltvaluegtuzytkownik02Sprzetlt/valuegt
- lt/listgt
- lt/propertygt
29Przykladowy Bean dla kontrolera (II)
- ltproperty name"pageTitles"gt
- ltlistgt
- ltvaluegtDane uzytkownikalt/valuegt
- ltvaluegtLokalizacjalt/valuegt
- ltvaluegtUrzadzenialt/valuegt
- lt/listgt
- lt/propertygt
- ltproperty name"validator"gt
- ltbean class"validator.UzytkownikValidator"gt
- ltproperty name"maxPasswordLength"
value"15"gtlt/propertygt - ltproperty name"minPasswordLength"
value"8"gtlt/propertygt - lt/beangt
- lt/propertygt
30Automatyczne wstrzykiwanie zaleznosci
- _at_Autowired
- _at_Qualifier("uzytkownikDAO")
- private UzytkownikDAO uzytkownikDAO
31Deklarowanie obiektów domenowych
- ltbean id"hibernateSessionFactory ...
- ltproperty name"packagesToScan"gt
- ltlistgt
- ltvaluegtdomainlt/valuegt
- lt/listgt
- lt/propertygt
- lt/beangt
32Automatyczne tworzenie beanów
- _at_Repository(uzytkownikDAO")
- public class UzytkownikDAOImpl
- _at_Service("uzytkownikService")
- public class UzytkownikServiceImpl
- _at_Controller
- _at_Scope("session")
- public class UzytkownikListController
- ltcontextcomponent-scan base-package"dao" /gt