2. Programowanie Komponentowe
Wykład #A: Wprowadzenie do Spring Framework
Mikołaj Olszewski
Wydział Zastosowań Informatyki i Matematyki
Szkoły Głównej Gospodarstwa Wiejskiego
16.12.2014
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 2 / 38
3. Plan wykładu
1 Wprowadzenie
2 Łączenie ziaren
Deklarowanie ziaren
Wstrzykiwanie właściwości
Spring Expression Language
3 Podsumowanie
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 3 / 38
4. Wprowadzenie
Plan wykładu
1 Wprowadzenie
2 Łączenie ziaren
Deklarowanie ziaren
Wstrzykiwanie właściwości
Spring Expression Language
3 Podsumowanie
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 4 / 38
5. Wprowadzenie
Nieco historii. . .
JavaBeans spec. 1.00-A — grudzień 1996
ogólnego przeznaczenia
wykorzystywane do GUI
zbyt proste do „poważnych zastosowań”
¬(transakcje, bezpieczeństwo, prog. rozproszone)
Enterprise JavaBeans spec. 1.0 — marzec 1998
do zastosowań serwerowych
dużo dodatkowych usług
brak prostoty
mały związek z JavaBeans
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 5 / 38
6. Wprowadzenie
Nieco historii. . .
JavaBeans spec. 1.00-A — grudzień 1996
ogólnego przeznaczenia
wykorzystywane do GUI
zbyt proste do „poważnych zastosowań”
¬(transakcje, bezpieczeństwo, prog. rozproszone)
Enterprise JavaBeans spec. 1.0 — marzec 1998
do zastosowań serwerowych
dużo dodatkowych usług
brak prostoty
mały związek z JavaBeans
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 5 / 38
7. Wprowadzenie
Motywacja
Problemy EJB
niespełniony cel (uproszczenie budowania aplikacji serwerowych)
dodatkowe opisywanie ziaren
sklejanie kodu (interfejsy lokalne i zdalne)
silna zależność od frameworka
Cel: zachowanie +, redukcja -
POJO (przeważnie JB)
DI
AOP
I tak narodził się Spring. . . a potem EJB 3
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 6 / 38
8. Wprowadzenie
Motywacja
Problemy EJB
niespełniony cel (uproszczenie budowania aplikacji serwerowych)
dodatkowe opisywanie ziaren
sklejanie kodu (interfejsy lokalne i zdalne)
silna zależność od frameworka
Cel: zachowanie +, redukcja -
POJO (przeważnie JB)
DI
AOP
I tak narodził się Spring. . . a potem EJB 3
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 6 / 38
9. Wprowadzenie
Motywacja
Problemy EJB
niespełniony cel (uproszczenie budowania aplikacji serwerowych)
dodatkowe opisywanie ziaren
sklejanie kodu (interfejsy lokalne i zdalne)
silna zależność od frameworka
Cel: zachowanie +, redukcja -
POJO (przeważnie JB)
DI
AOP
I tak narodził się Spring. . . a potem EJB 3
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 6 / 38
10. Wprowadzenie
Motywacja
Problemy EJB
niespełniony cel (uproszczenie budowania aplikacji serwerowych)
dodatkowe opisywanie ziaren
sklejanie kodu (interfejsy lokalne i zdalne)
silna zależność od frameworka
Cel: zachowanie +, redukcja -
POJO (przeważnie JB)
DI
AOP
I tak narodził się Spring. . . a potem EJB 3
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 6 / 38
11. Wprowadzenie
Motywacja
Problemy EJB
niespełniony cel (uproszczenie budowania aplikacji serwerowych)
dodatkowe opisywanie ziaren
sklejanie kodu (interfejsy lokalne i zdalne)
silna zależność od frameworka
Cel: zachowanie +, redukcja -
POJO (przeważnie JB)
DI
AOP
I tak narodził się Spring. . . a potem EJB 3
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 6 / 38
13. Wprowadzenie
Kontener
Kluczowa funkcjonalność Springa
Mechanizm DI
Rodzaje
org.springframework.beans.factory.BeanFactory
org.springframework.context.ApplicationContext
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
XmlWebApplicationContext
Metoda getBean() do wyłuskania ziarna
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 8 / 38
14. Wprowadzenie
Cykl życia ziarna
Rysunek: Cykl życia ziarna we frameworku Spring (źródło: „Spring in Action”)
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 9 / 38
16. Wprowadzenie
Rodzina Springa
Spring Web Flow
Spring Web Services
Spring Security
Spring Integration
Spring Batch
Spring Social
Spring Mobile
Spring Dynamic Modules
Spring LDAP
Spring Rich Client
Spring.NET
Spring-Flex
Spring Roo
Spring Extensions
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 11 / 38
17. Łączenie ziaren
Plan wykładu
1 Wprowadzenie
2 Łączenie ziaren
Deklarowanie ziaren
Wstrzykiwanie właściwości
Spring Expression Language
3 Podsumowanie
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 12 / 38
18. Łączenie ziaren Deklarowanie ziaren
Scenariusz
1 package pk . demo . s p r i n g ;
2
3 p u b l i c i n t e r f a c e Hero {
4 void r e s c u e () throws RescueException ;
5 }
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s J e d i implements Hero {
4 p r i v a t e i n t l i g h t s a b e r s C o u n t = 1;
5
6 p u b l i c J e d i () { }
7
8 p u b l i c J e d i ( i n t l i g h t s a b e r s C o u n t ) {
9 t h i s . l i g h t s a b e r s C o u n t = l i g h t s a b e r s C o u n t ;
10 }
11
12 p u b l i c void r e s c u e () throws RescueException {
13 System . out . p r i n t l n ( ” I come to the r e s c u e with ” +
l i g h t s a b e r s C o u n t + ” l i g h t s a b e r s ” ) ;
14 }
15 }
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 13 / 38
19. Łączenie ziaren Deklarowanie ziaren
Scenariusz
1 package pk . demo . s p r i n g ;
2
3 p u b l i c i n t e r f a c e Hero {
4 void r e s c u e () throws RescueException ;
5 }
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s J e d i implements Hero {
4 p r i v a t e i n t l i g h t s a b e r s C o u n t = 1;
5
6 p u b l i c J e d i () { }
7
8 p u b l i c J e d i ( i n t l i g h t s a b e r s C o u n t ) {
9 t h i s . l i g h t s a b e r s C o u n t = l i g h t s a b e r s C o u n t ;
10 }
11
12 p u b l i c void r e s c u e () throws RescueException {
13 System . out . p r i n t l n ( ” I come to the r e s c u e with ” +
l i g h t s a b e r s C o u n t + ” l i g h t s a b e r s ” ) ;
14 }
15 }
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 13 / 38
20. Łączenie ziaren Deklarowanie ziaren
Kasting
1 <?xml v e r s i o n=” 1.0 ” encoding=”UTF−8”?>
2 <beans xmlns=” h t t p : //www. springframework . org /schema/ beans ”
3 x m l n s : x s i=” h t t p : //www. w3 . org /2001/XMLSchema−i n s t a n c e ”
4 x s i : s c h e m a L o c a t i o n=” h t t p : //www. springframework . org /schema/ beans
5 h t t p : //www. springframework . org /schema/ beans / spring −beans −3.0. xsd
”>
6
7 <bean i d=” l u k e ” c l a s s=”pk . demo . s p r i n g . J e d i ” />
8
9 <bean i d=” anakin ” c l a s s=”pk . demo . s p r i n g . J e d i ”>
10 <c o n s t r u c t o r −arg v a l u e=”2” />
11 </bean>
12
13 </ beans>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 14 / 38
21. Łączenie ziaren Deklarowanie ziaren
I. . . akcja!
1 A p p l i c a t i o n C o n t e x t ctx = new ClassPathXmlApplicationContext (
2 ”pk/demo/ s p r i n g / b a t t l e −of−e a r t h . xml” ) ;
3 Hero hero = ( Hero ) ctx . getBean ( ” l u k e ” ) ;
4 hero . r e s c u e () ;
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 15 / 38
22. Łączenie ziaren Deklarowanie ziaren
Zależności I
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s J e d i C o n s u l a r extends J e d i {
4 p r i v a t e MindTrick t r i c k ;
5
6 p u b l i c J e d i C o n s u l a r ( MindTrick t r i c k ) {
7 super () ;
8 t h i s . t r i c k = t r i c k ;
9 }
10
11 p u b l i c J e d i C o n s u l a r ( i n t l i g h t s a b e r s C o u n t , MindTrick t r i c k ) {
12 super ( l i g h t s a b e r s C o u n t ) ;
13 t h i s . t r i c k = t r i c k ;
14 }
15
16 p u b l i c void r e s c u e () throws RescueException {
17 super . r e s c u e () ;
18 System . out . p r i n t l n ( ”and . . . ” ) ;
19 t r i c k . use () ;
20 }
21 }
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 16 / 38
23. Łączenie ziaren Deklarowanie ziaren
Zależności II
1 package pk . demo . s p r i n g ;
2
3 p u b l i c i n t e r f a c e MindTrick {
4 void use () ;
5 }
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s P e r s u a t i o n implements MindTrick {
4 p u b l i c void use () {
5 System . out . p r i n t l n ( ”You agree with me . . . ” ) ;
6 }
7 }
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 17 / 38
24. Łączenie ziaren Deklarowanie ziaren
Zależności III
1 <bean i d=” p e r s u a t i o n ” c l a s s=”pk . demo . s p r i n g . P e r s u a t i o n ” />
2
3 <bean i d=”mace” c l a s s=”pk . demo . s p r i n g . J e d i C o n s u l a r ”>
4 <c o n s t r u c t o r −arg v a l u e=”1” />
5 <c o n s t r u c t o r −arg r e f=” p e r s u a t i o n ” />
6 </bean>
Rozróżnianie argumentów
dopasowanie typu i kolejności
type
index
name (opcja debug, @ConstructorProperties)
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 18 / 38
25. Łączenie ziaren Deklarowanie ziaren
Zależności III
1 <bean i d=” p e r s u a t i o n ” c l a s s=”pk . demo . s p r i n g . P e r s u a t i o n ” />
2
3 <bean i d=”mace” c l a s s=”pk . demo . s p r i n g . J e d i C o n s u l a r ”>
4 <c o n s t r u c t o r −arg v a l u e=”1” />
5 <c o n s t r u c t o r −arg r e f=” p e r s u a t i o n ” />
6 </bean>
Rozróżnianie argumentów
dopasowanie typu i kolejności
type
index
name (opcja debug, @ConstructorProperties)
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 18 / 38
26. Łączenie ziaren Deklarowanie ziaren
Fabryki
1 package pk . demo . s p r i n g ;
2
3 p u b l i c i n t e r f a c e Mission { . . . }
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s M i s s i o n R e p o s i t o r y {
4 p u b l i c s t a t i c Mission getNextMission () { . . . }
5 p u b l i c s t a t i c Mission a s s i g n M i s s i o n ( Hero hero ) { . . . }
6 }
1 <bean i d=” nextMission ” c l a s s=”pk . demo . s p r i n g . M i s s i o n R e p o s i t o r y ”
2 f a c t o r y −method=” getNextMission ” />
3
4 <bean i d=” m i s s i o n R e p o s i t o r y ” c l a s s=”pk . demo . s p r i n g .
M i s s i o n R e p o s i t o r y ” />
5 <bean i d=” m i s s i o n ” f a c t o r y −bean=” m i s s i o n R e p o s i t o r y ”
6 f a c t o r y −method=” a s s i g n M i s s i o n ”>
7 <c o n s t r u c t o r −arg r e f=” l u k e ” />
8 </bean>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 19 / 38
27. Łączenie ziaren Deklarowanie ziaren
Zakresy
singleton (w obrębie kontekstu)
prototype
request
session
global-session
1 <bean i d=” t i c k e t ” c l a s s=”pk . demo . s p r i n g . Ticket ” scope=” prototype ”/>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 20 / 38
28. Łączenie ziaren Deklarowanie ziaren
Zakresy
singleton (w obrębie kontekstu)
prototype
request
session
global-session
1 <bean i d=” t i c k e t ” c l a s s=”pk . demo . s p r i n g . Ticket ” scope=” prototype ”/>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 20 / 38
29. Łączenie ziaren Deklarowanie ziaren
Inicjalizacja i niszczenie ziarna
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s V e h i c l e {
4 p u b l i c void launch () { . . . }
5 p u b l i c void park () { . . . }
6 }
1 <bean i d=” car ”
2 c l a s s=”pk . demo . s p r i n g . V e h i c l e ”
3 i n i t −method=” launch ”
4 destroy −method=” park ” />
InitializingBean
afterPropertiesSet()
DisposableBean
destroy()
Metody domyślne (w beans)
default-init-method
default-destroy-method
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 21 / 38
30. Łączenie ziaren Deklarowanie ziaren
Inicjalizacja i niszczenie ziarna
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s V e h i c l e {
4 p u b l i c void launch () { . . . }
5 p u b l i c void park () { . . . }
6 }
1 <bean i d=” car ”
2 c l a s s=”pk . demo . s p r i n g . V e h i c l e ”
3 i n i t −method=” launch ”
4 destroy −method=” park ” />
InitializingBean
afterPropertiesSet()
DisposableBean
destroy()
Metody domyślne (w beans)
default-init-method
default-destroy-method
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 21 / 38
31. Łączenie ziaren Wstrzykiwanie właściwości
Wstrzykiwanie właściwości
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 22 / 38
32. Łączenie ziaren Wstrzykiwanie właściwości
Ustawianie właściwości I
Wykorzystanie setterów z konwencji JavaBeans
Setter Injection
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s DemiGod implements Hero {
4 p r i v a t e S t r i n g name ;
5 p r i v a t e Power power ;
6
7 p u b l i c S t r i n g getName () { return name ; }
8 p u b l i c void setName ( S t r i n g name) {
9 t h i s . name = name ;
10 }
11
12 p u b l i c void setPower ( Power power ) {
13 t h i s . power = power ;
14 }
15
16 p u b l i c void r e s c u e () throws RescueException {
17 System . out . p r i n t l n ( ” I , ” + name + ” , come to r e s c u e with my
power ” ) ;
18 power . use () ;
19 }Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 23 / 38
33. Łączenie ziaren Wstrzykiwanie właściwości
Ustawianie właściwości II
1 package pk . demo . s p r i n g ;
2
3 p u b l i c i n t e r f a c e Power {
4 void use () ;
5 }
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s EnormousStrength implements Power {
4 p u b l i c void use () {
5 System . out . p r i n t l n ( ”LUP, LUP, BEC” ) ;
6 }
7 }
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 24 / 38
34. Łączenie ziaren Wstrzykiwanie właściwości
Ustawianie właściwości III
1 <bean i d=” super−s t r e n g t h ” c l a s s=”pk . demo . s p r i n g . EnormousStrength ”/>
2
3 <bean i d=” h e r c u l e s ” c l a s s=”pk . demo . s p r i n g . DemiGod”>
4 <p r o p e r t y name=”name” v a l u e=” H e r c u l e s ” />
5 <p r o p e r t y name=” power ” r e f=” super−s t r e n g t h ” />
6 </bean>
1 <bean i d=” h e r c u l e s ” c l a s s=”pk . demo . s p r i n g . DemiGod”>
2 <p r o p e r t y name=”name” v a l u e=” H e r c u l e s ” />
3 <p r o p e r t y name=” power ”>
4 <bean c l a s s=”pk . demo . s p r i n g . EnormousStrength ” />
5 </ p r o p e r t y>
6 </bean>
xmlns:p="http://www.springframework.org/schema/p"
1 <bean i d=” h e r c u l e s ” c l a s s=”pk . demo . s p r i n g . DemiGod”
2 p:name=” H e r c u l e s ”
3 p:power−r e f=” super−s t r e n g t h ” />
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 25 / 38
35. Łączenie ziaren Wstrzykiwanie właściwości
Ustawianie właściwości III
1 <bean i d=” super−s t r e n g t h ” c l a s s=”pk . demo . s p r i n g . EnormousStrength ”/>
2
3 <bean i d=” h e r c u l e s ” c l a s s=”pk . demo . s p r i n g . DemiGod”>
4 <p r o p e r t y name=”name” v a l u e=” H e r c u l e s ” />
5 <p r o p e r t y name=” power ” r e f=” super−s t r e n g t h ” />
6 </bean>
1 <bean i d=” h e r c u l e s ” c l a s s=”pk . demo . s p r i n g . DemiGod”>
2 <p r o p e r t y name=”name” v a l u e=” H e r c u l e s ” />
3 <p r o p e r t y name=” power ”>
4 <bean c l a s s=”pk . demo . s p r i n g . EnormousStrength ” />
5 </ p r o p e r t y>
6 </bean>
xmlns:p="http://www.springframework.org/schema/p"
1 <bean i d=” h e r c u l e s ” c l a s s=”pk . demo . s p r i n g . DemiGod”
2 p:name=” H e r c u l e s ”
3 p:power−r e f=” super−s t r e n g t h ” />
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 25 / 38
36. Łączenie ziaren Wstrzykiwanie właściwości
Ustawianie właściwości III
1 <bean i d=” super−s t r e n g t h ” c l a s s=”pk . demo . s p r i n g . EnormousStrength ”/>
2
3 <bean i d=” h e r c u l e s ” c l a s s=”pk . demo . s p r i n g . DemiGod”>
4 <p r o p e r t y name=”name” v a l u e=” H e r c u l e s ” />
5 <p r o p e r t y name=” power ” r e f=” super−s t r e n g t h ” />
6 </bean>
1 <bean i d=” h e r c u l e s ” c l a s s=”pk . demo . s p r i n g . DemiGod”>
2 <p r o p e r t y name=”name” v a l u e=” H e r c u l e s ” />
3 <p r o p e r t y name=” power ”>
4 <bean c l a s s=”pk . demo . s p r i n g . EnormousStrength ” />
5 </ p r o p e r t y>
6 </bean>
xmlns:p="http://www.springframework.org/schema/p"
1 <bean i d=” h e r c u l e s ” c l a s s=”pk . demo . s p r i n g . DemiGod”
2 p:name=” H e r c u l e s ”
3 p:power−r e f=” super−s t r e n g t h ” />
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 25 / 38
37. Łączenie ziaren Wstrzykiwanie właściwości
Wsparcie dla kolekcji
<list>
<set>
<map>
<props>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 26 / 38
38. Łączenie ziaren Wstrzykiwanie właściwości
Ustawianie kolekcji I
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s SuperHero implements Hero {
4 p r i v a t e C o l l e c t i o n <Power> powers ;
5
6 p u b l i c void setPowers ( C o l l e c t i o n <Power> powers ) {
7 t h i s . powers = powers ;
8 }
9
10 p u b l i c void r e s c u e () throws RescueException {
11 f o r ( Power power : powers ) {
12 power . use () ;
13 }
14 }
15 }
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 27 / 38
39. Łączenie ziaren Wstrzykiwanie właściwości
Ustawianie kolekcji II
1 <bean i d=” superman ” c l a s s=”pk . demo . s p r i n g . SuperHero ”>
2 <p r o p e r t y name=” powers ”>
3 <s e t>
4 <r e f bean=” f l i g t h ” />
5 <r e f bean=” heat−v i s i o n ” />
6 <r e f bean=”x−ray−v i s i o n ” />
7 <r e f bean=” superhuman−s t r e n g t h ” />
8 <r e f bean=” superhuman−s t r e n g t h ” />
9 </ s e t>
10 </ p r o p e r t y>
11 </bean>
<map>: entry — key, key-ref, value, value-ref
<props>: prop — key — wartość tekstowa
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 28 / 38
40. Łączenie ziaren Wstrzykiwanie właściwości
Ustawianie kolekcji II
1 <bean i d=” superman ” c l a s s=”pk . demo . s p r i n g . SuperHero ”>
2 <p r o p e r t y name=” powers ”>
3 <s e t>
4 <r e f bean=” f l i g t h ” />
5 <r e f bean=” heat−v i s i o n ” />
6 <r e f bean=”x−ray−v i s i o n ” />
7 <r e f bean=” superhuman−s t r e n g t h ” />
8 <r e f bean=” superhuman−s t r e n g t h ” />
9 </ s e t>
10 </ p r o p e r t y>
11 </bean>
<map>: entry — key, key-ref, value, value-ref
<props>: prop — key — wartość tekstowa
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 28 / 38
41. Łączenie ziaren Spring Expression Language
Spring Expression Language
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 29 / 38
42. Łączenie ziaren Spring Expression Language
Spring Expression Language
Wyznaczanie wartości w trakcie działania programu
Dostęp do ziaren, metod i właściwości
Operacje matematyczne i logiczne
Wyrażenia regularne
Manipulacje na kolekcjach
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 30 / 38
43. Łączenie ziaren Spring Expression Language
Podstawy
1 <p r o p e r t y name=” count ” v a l u e=”#{5}”/>
2 <p r o p e r t y name=” frequency ” v a l u e=”#{89.7}”/>
3 <p r o p e r t y name=” c a p a c i t y ” v a l u e=”#{1e4}”/>
4 <p r o p e r t y name=” message ” v a l u e=”The v a l u e i s #{5}”/>
5 <p r o p e r t y name=”name” v a l u e=”#{’ Hercules ’} ”/>
6 <p r o p e r t y name=” enabled ” v a l u e=”#{ f a l s e }”/>
7
8 <p r o p e r t y name=” power ” v a l u e=”#{super−s t r e n g t h }”/>
9 <p r o p e r t y name=” power ” v a l u e=”#{h e r c u l e s . power}”/>
10 <p r o p e r t y name=” power ” v a l u e=”#{p ow e rS el e ct or . selectPower () }”/>
11
12 <p r o p e r t y name=” m u l t i p l i e r ” v a l u e=”#{T( j a v a . lang . Math) . PI }”/>
13 <p r o p e r t y name=”randomNumber” v a l u e=”#{T( j a v a . lang . Math) . random () }”
/>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 31 / 38
44. Łączenie ziaren Spring Expression Language
Operacje
1 <p r o p e r t y name=” adjustedAmount ” v a l u e=”#{counter . t o t a l + 42}”/>
2 <p r o p e r t y name=” adjustedAmount ” v a l u e=”#{counter . t o t a l − 20}”/>
3 <p r o p e r t y name=” c i r c u m f e r e n c e ” v a l u e=”#{2 ∗ T( j a v a . lang . Math) . PI ∗
c i r c l e . r a d i u s }”/>
4 <p r o p e r t y name=” average ” v a l u e=”#{counter . t o t a l / counter . count }”/>
5 <p r o p e r t y name=” remainder ” v a l u e=”#{counter . t o t a l % counter . count }”
/>
6 <p r o p e r t y name=” area ” v a l u e=”#{T( j a v a . lang . Math) . PI ∗ c i r c l e . r a d i u s
ˆ 2}”/>
7 <p r o p e r t y name=” fullName ” v a l u e=”#{person . firstName + ’ ’ + person .
lastName }”/>
8
9 <p r o p e r t y name=” equal ” v a l u e=”#{counter . t o t a l == 100} ”/>
10 <p r o p e r t y name=” hasCapacity ” v a l u e=”#{counter . t o t a l l e 100000} ”/>
11 <p r o p e r t y name=” l a r g e C i r c l e ” v a l u e=”#{shape . kind == ’ c i r c l e ’ and
shape . p e r i m e t e r gt 10000} ”/>
12 <p r o p e r t y name=” outOfStock ” v a l u e=”#{! product . a v a i l a b l e }”/>
13 <p r o p e r t y name=” outOfStock ” v a l u e=”#{not product . a v a i l a b l e }”/>
14
15 <p r o p e r t y name=” v a l i d E m a i l ” v a l u e=”#{admin . email matches ’ [ a−zA−Z0
−9. %+−]+@[ a−zA−Z0−9.−]+.com ’} ”/>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 32 / 38
45. Łączenie ziaren Spring Expression Language
Operacje na kolekcjach I
1 package pk . demo . s p r i n g ;
2 p u b l i c c l a s s City {
3 p r i v a t e S t r i n g name ;
4 p r i v a t e i n t p o p u l a t i o n ;
5 . . .
6 }
1 < u t i l : l i s t i d=” c i t i e s ”>
2 <bean c l a s s=”pk . demo . s p r i n g . City ”
3 p:name=”Warszawa” p : p o p u l a t i o n=” 1720398 ”/>
4 <bean c l a s s=”pk . demo . s p r i n g . City ”
5 p:name=”Krakow” p : p o p u l a t i o n=” 756183 ”/>
6 <bean c l a s s=”pk . demo . s p r i n g . City ”
7 p:name=” Lodz ” p : p o p u l a t i o n=” 737098 ”/>
8 <bean c l a s s=”pk . demo . s p r i n g . City ”
9 p:name=”Wroclaw” p : p o p u l a t i o n=” 632996 ”/>
10 <bean c l a s s=”pk . demo . s p r i n g . City ”
11 p:name=”Poznan” p : p o p u l a t i o n=” 551627 ”/>
12 </ u t i l : l i s t>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 33 / 38
46. Łączenie ziaren Spring Expression Language
Operacje na kolekcjach II
1 <p r o p e r t y name=” chosenCity ” v a l u e=”#{ c i t i e s [ 2 ] } ”/>
2 <p r o p e r t y name=” chosenCity ” v a l u e=”#{ c i t i e s [ ’ Warszawa ’ ] } ”/>
3
4 <p r o p e r t y name=”homePath” v a l u e=”#{systemEnvironment [ ’HOME’ ] } ”/>
5 <p r o p e r t y name=”homePath” v a l u e=”#{s y s t e m P r o p e r t i e s [ ’ a p p l i c a t i o n .
home ’ ] } ”/>
6
7 <p r o p e r t y name=” b i g C i t i e s ” v a l u e=”#{ c i t i e s . ? [ p o p u l a t i o n gt 100000]}
”/>
8 <p r o p e r t y name=” aBigCity ” v a l u e=”#{ c i t i e s . ˆ [ p o p u l a t i o n gt 100000]} ”
/>
9 <p r o p e r t y name=” aBigCity ” v a l u e=”#{ c i t i e s . $ [ p o p u l a t i o n gt 100000]} ”
/>
10
11 <p r o p e r t y name=” cityNames ” v a l u e=”#{ c i t i e s . ! [ name ]} ”/>
12 <p r o p e r t y name=” c i t y I n f o s ” v a l u e=”#{ c i t i e s . ! [ name+’(’+ p o p u l a t i o n + ’)
’ ] } ”/>
13 <p r o p e r t y name=” b i g C i t y I n f o s ” v a l u e=”#{ c i t i e s . ? [ p o p u l a t i o n gt
1 0 0 0 0 0 ] . ! [ name+’(’+ p o p u l a t i o n + ’) ’ ] } ”/>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 34 / 38
47. Podsumowanie
Plan wykładu
1 Wprowadzenie
2 Łączenie ziaren
Deklarowanie ziaren
Wstrzykiwanie właściwości
Spring Expression Language
3 Podsumowanie
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 35 / 38
48. Podsumowanie
Podsumowanie
Spring — lekka odpowiedź na EJB
Sprawdzone i lubiane: POJO, DI, AOP
Spring Core — kontener DI
constructor injection
setter injection
interface injection
method injection
SpEL
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 36 / 38
49. Podsumowanie
Do domu
Przeczytać rozdziały 1, 2 ze „Spring w Akcji” (3. lub 4. ed.)
W praktyce zapoznać się ze spring-iem
konfiguracja w xml-u
wsparcie IDE (np. SpringToolSuite)
Komponenty w javie
jak w #6
tematyka jak w #2
osobne paczki jar
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 37 / 38