SlideShare a Scribd company logo
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 1 / 38
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
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
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
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
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
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
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
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
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
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
Wprowadzenie
Prostota
POJO
DI
AOP
zebranie funkcjonalności przekrojowej (np. logowanie zdarzeń)
rozdzielenie odpowiedzialności (brak powielania i śmiecenia)
Rysunek: AOP (źródło: „Spring in Action”)
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 7 / 38
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
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
Wprowadzenie
Budowa modułowa
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 10 / 38
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
Łą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
Łą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
Łą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
Łą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
Łą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
Łą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
Łą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
Łą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
Łą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
Łą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
Łą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
Łą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
Łą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
Łą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
Łączenie ziaren Wstrzykiwanie właściwości
Wstrzykiwanie właściwości
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 22 / 38
Łą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
Łą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
Łą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
Łą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
Łą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
Łą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
Łą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
Łą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
Łą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
Łączenie ziaren Spring Expression Language
Spring Expression Language
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 29 / 38
Łą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
Łą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
Łą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
Łą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
Łą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
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
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
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
Podsumowanie
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 38 / 38

More Related Content

PDF
Programowanie Komponentowe: #9 Java Beans
PDF
Programowanie Komponentowe: #7 Programowanie asynchroniczne i sterowane zdarz...
PDF
Programowanie Komponentowe: #D Model komponentowy OSGi
PDF
PDF
Wprowadzenie do J2ME
PDF
Jak napisać własny RTOS!
PDF
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
PDF
Materiały fotorefrakcyjne
Programowanie Komponentowe: #9 Java Beans
Programowanie Komponentowe: #7 Programowanie asynchroniczne i sterowane zdarz...
Programowanie Komponentowe: #D Model komponentowy OSGi
Wprowadzenie do J2ME
Jak napisać własny RTOS!
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
Materiały fotorefrakcyjne

Viewers also liked (13)

PDF
Programowanie Komponentowe: #C Wprowadzenie do OSGi
PDF
The metadata driven e-laboratory web client
PDF
Programowanie Komponentowe: #E Podsumowanie
PDF
Optoelektroniczne modelowanie sieci neuronowej cz. 1
PDF
Parallel quicksort cz. 2
PDF
Programowanie Komponentowe: #6 Wersjonowanie
PDF
Programowanie Komponentowe: #B Komponentowe aspekty springa
PDF
Kwantowe struktury półprzewodnikowe
PDF
Optyczne solitony przestrzenne
PDF
Programowanie Komponentowe: #1 Wprowadzenie
PPTX
Architektura heksagonalna
PDF
Lokalne sieci światłowodowe
PDF
Optyka ciekłych kryształów
Programowanie Komponentowe: #C Wprowadzenie do OSGi
The metadata driven e-laboratory web client
Programowanie Komponentowe: #E Podsumowanie
Optoelektroniczne modelowanie sieci neuronowej cz. 1
Parallel quicksort cz. 2
Programowanie Komponentowe: #6 Wersjonowanie
Programowanie Komponentowe: #B Komponentowe aspekty springa
Kwantowe struktury półprzewodnikowe
Optyczne solitony przestrzenne
Programowanie Komponentowe: #1 Wprowadzenie
Architektura heksagonalna
Lokalne sieci światłowodowe
Optyka ciekłych kryształów
Ad

More from Mikołaj Olszewski (14)

PDF
Optoelektroniczne sieci neuronowe
PDF
Swiatłowodowy czujnik prądu
PDF
Metody efektywnego łączenia sieci neuronowych
PDF
Parallel quicksort cz. 1
PDF
Maszyna Turinga
PDF
Planowanie działań cz. 2
PDF
Planowanie działań cz. 1
PDF
Model hierarchiczny
PDF
Komputer genetyczny
PDF
Test wyszukiwarek internetowych
PDF
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
PDF
Programowanie komponentowe: #4 Podstawy połączeń komponentów
PDF
Programowanie Komponentowe: #3 Podstawy programowania komponentów
PDF
Programowanie Komponentowe: #2 Metody opisu komponentów
Optoelektroniczne sieci neuronowe
Swiatłowodowy czujnik prądu
Metody efektywnego łączenia sieci neuronowych
Parallel quicksort cz. 1
Maszyna Turinga
Planowanie działań cz. 2
Planowanie działań cz. 1
Model hierarchiczny
Komputer genetyczny
Test wyszukiwarek internetowych
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie komponentowe: #4 Podstawy połączeń komponentów
Programowanie Komponentowe: #3 Podstawy programowania komponentów
Programowanie Komponentowe: #2 Metody opisu komponentów
Ad

Programowanie Komponentowe: #A Wprowadzenie do Springa

  • 1. Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 1 / 38
  • 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
  • 12. Wprowadzenie Prostota POJO DI AOP zebranie funkcjonalności przekrojowej (np. logowanie zdarzeń) rozdzielenie odpowiedzialności (brak powielania i śmiecenia) Rysunek: AOP (źródło: „Spring in Action”) Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 7 / 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
  • 15. Wprowadzenie Budowa modułowa Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 10 / 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
  • 50. Podsumowanie Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #A 38 / 38