SlideShare a Scribd company logo
1 of 50
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

Viewers also liked

Programowanie Komponentowe: #C Wprowadzenie do OSGi
Programowanie Komponentowe: #C Wprowadzenie do OSGiProgramowanie Komponentowe: #C Wprowadzenie do OSGi
Programowanie Komponentowe: #C Wprowadzenie do OSGiMikołaj Olszewski
 
The metadata driven e-laboratory web client
The metadata driven e-laboratory web clientThe metadata driven e-laboratory web client
The metadata driven e-laboratory web clientMikołaj Olszewski
 
Programowanie Komponentowe: #E Podsumowanie
Programowanie Komponentowe: #E PodsumowanieProgramowanie Komponentowe: #E Podsumowanie
Programowanie Komponentowe: #E PodsumowanieMikołaj Olszewski
 
Optoelektroniczne modelowanie sieci neuronowej cz. 1
Optoelektroniczne modelowanie sieci neuronowej cz. 1Optoelektroniczne modelowanie sieci neuronowej cz. 1
Optoelektroniczne modelowanie sieci neuronowej cz. 1Mikołaj Olszewski
 
Programowanie Komponentowe: #6 Wersjonowanie
Programowanie Komponentowe: #6 WersjonowanieProgramowanie Komponentowe: #6 Wersjonowanie
Programowanie Komponentowe: #6 WersjonowanieMikołaj Olszewski
 
Programowanie Komponentowe: #B Komponentowe aspekty springa
Programowanie Komponentowe: #B Komponentowe aspekty springaProgramowanie Komponentowe: #B Komponentowe aspekty springa
Programowanie Komponentowe: #B Komponentowe aspekty springaMikołaj Olszewski
 
Kwantowe struktury półprzewodnikowe
Kwantowe struktury półprzewodnikoweKwantowe struktury półprzewodnikowe
Kwantowe struktury półprzewodnikoweMikołaj Olszewski
 
Optyczne solitony przestrzenne
Optyczne solitony przestrzenneOptyczne solitony przestrzenne
Optyczne solitony przestrzenneMikołaj Olszewski
 
Programowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 WprowadzenieProgramowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 WprowadzenieMikołaj Olszewski
 

Viewers also liked (13)

Programowanie Komponentowe: #C Wprowadzenie do OSGi
Programowanie Komponentowe: #C Wprowadzenie do OSGiProgramowanie Komponentowe: #C Wprowadzenie do OSGi
Programowanie Komponentowe: #C Wprowadzenie do OSGi
 
The metadata driven e-laboratory web client
The metadata driven e-laboratory web clientThe metadata driven e-laboratory web client
The metadata driven e-laboratory web client
 
Programowanie Komponentowe: #E Podsumowanie
Programowanie Komponentowe: #E PodsumowanieProgramowanie Komponentowe: #E Podsumowanie
Programowanie Komponentowe: #E Podsumowanie
 
Optoelektroniczne modelowanie sieci neuronowej cz. 1
Optoelektroniczne modelowanie sieci neuronowej cz. 1Optoelektroniczne modelowanie sieci neuronowej cz. 1
Optoelektroniczne modelowanie sieci neuronowej cz. 1
 
Parallel quicksort cz. 2
Parallel quicksort cz. 2Parallel quicksort cz. 2
Parallel quicksort cz. 2
 
Programowanie Komponentowe: #6 Wersjonowanie
Programowanie Komponentowe: #6 WersjonowanieProgramowanie Komponentowe: #6 Wersjonowanie
Programowanie Komponentowe: #6 Wersjonowanie
 
Programowanie Komponentowe: #B Komponentowe aspekty springa
Programowanie Komponentowe: #B Komponentowe aspekty springaProgramowanie Komponentowe: #B Komponentowe aspekty springa
Programowanie Komponentowe: #B Komponentowe aspekty springa
 
Kwantowe struktury półprzewodnikowe
Kwantowe struktury półprzewodnikoweKwantowe struktury półprzewodnikowe
Kwantowe struktury półprzewodnikowe
 
Optyczne solitony przestrzenne
Optyczne solitony przestrzenneOptyczne solitony przestrzenne
Optyczne solitony przestrzenne
 
Programowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 WprowadzenieProgramowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 Wprowadzenie
 
Architektura heksagonalna
Architektura heksagonalnaArchitektura heksagonalna
Architektura heksagonalna
 
Lokalne sieci światłowodowe
Lokalne sieci światłowodoweLokalne sieci światłowodowe
Lokalne sieci światłowodowe
 
Optyka ciekłych kryształów
Optyka ciekłych kryształówOptyka ciekłych kryształów
Optyka ciekłych kryształów
 

Similar to Programowanie Komponentowe: #A Wprowadzenie do Springa

Programowanie Komponentowe: #3 Podstawy programowania komponentów
Programowanie Komponentowe: #3 Podstawy programowania komponentówProgramowanie Komponentowe: #3 Podstawy programowania komponentów
Programowanie Komponentowe: #3 Podstawy programowania komponentówMikołaj Olszewski
 
Programowanie Komponentowe: #2 Metody opisu komponentów
Programowanie Komponentowe: #2 Metody opisu komponentówProgramowanie Komponentowe: #2 Metody opisu komponentów
Programowanie Komponentowe: #2 Metody opisu komponentówMikołaj Olszewski
 
Hadoop i okolice
Hadoop i okoliceHadoop i okolice
Hadoop i okolicezygm0nt
 
Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)Marcin Grzybowski
 
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NETProgramowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NETMikołaj Olszewski
 
Programowanie komponentowe: #4 Podstawy połączeń komponentów
Programowanie komponentowe: #4 Podstawy połączeń komponentówProgramowanie komponentowe: #4 Podstawy połączeń komponentów
Programowanie komponentowe: #4 Podstawy połączeń komponentówMikołaj Olszewski
 
Jak włamałem się do banku
Jak włamałem się do bankuJak włamałem się do banku
Jak włamałem się do bankuSlawomir Jasek
 
Let your existing devices enter the witchcraft of IoT and the smart-home world
Let your existing devices enter the witchcraft of IoT and the smart-home worldLet your existing devices enter the witchcraft of IoT and the smart-home world
Let your existing devices enter the witchcraft of IoT and the smart-home worldThe Software House
 
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...PROIDEA
 
ETW w służbie programisty .NET
ETW w służbie programisty .NETETW w służbie programisty .NET
ETW w służbie programisty .NETKonrad Kokosa
 
Secure Coding w praktyce.
Secure Coding w praktyce.Secure Coding w praktyce.
Secure Coding w praktyce.Semihalf
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychMarcin Jasiński
 
Nowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programistyNowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programistyMarcinStachniuk
 
Jak nie zwariować z tymi pakietami
Jak nie  zwariować z tymi pakietamiJak nie  zwariować z tymi pakietami
Jak nie zwariować z tymi pakietamiArek Bee.
 
Pascal. Ćwiczenia praktyczne
Pascal. Ćwiczenia praktycznePascal. Ćwiczenia praktyczne
Pascal. Ćwiczenia praktycznee-booksweb.pl
 
Wprowadzenie do technologii Puppet
Wprowadzenie do technologii PuppetWprowadzenie do technologii Puppet
Wprowadzenie do technologii PuppetSages
 
PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...
PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...
PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...PROIDEA
 
Bootloadery i programy bare metal.
Bootloadery i programy bare metal.Bootloadery i programy bare metal.
Bootloadery i programy bare metal.Semihalf
 

Similar to Programowanie Komponentowe: #A Wprowadzenie do Springa (20)

Programowanie Komponentowe: #3 Podstawy programowania komponentów
Programowanie Komponentowe: #3 Podstawy programowania komponentówProgramowanie Komponentowe: #3 Podstawy programowania komponentów
Programowanie Komponentowe: #3 Podstawy programowania komponentów
 
Programowanie Komponentowe: #2 Metody opisu komponentów
Programowanie Komponentowe: #2 Metody opisu komponentówProgramowanie Komponentowe: #2 Metody opisu komponentów
Programowanie Komponentowe: #2 Metody opisu komponentów
 
Hadoop i okolice
Hadoop i okoliceHadoop i okolice
Hadoop i okolice
 
Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)
 
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NETProgramowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
 
Programowanie komponentowe: #4 Podstawy połączeń komponentów
Programowanie komponentowe: #4 Podstawy połączeń komponentówProgramowanie komponentowe: #4 Podstawy połączeń komponentów
Programowanie komponentowe: #4 Podstawy połączeń komponentów
 
Jak włamałem się do banku
Jak włamałem się do bankuJak włamałem się do banku
Jak włamałem się do banku
 
Let your existing devices enter the witchcraft of IoT and the smart-home world
Let your existing devices enter the witchcraft of IoT and the smart-home worldLet your existing devices enter the witchcraft of IoT and the smart-home world
Let your existing devices enter the witchcraft of IoT and the smart-home world
 
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...
 
ETW w służbie programisty .NET
ETW w służbie programisty .NETETW w służbie programisty .NET
ETW w służbie programisty .NET
 
Secure Coding w praktyce.
Secure Coding w praktyce.Secure Coding w praktyce.
Secure Coding w praktyce.
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów Sparkowych
 
Nowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programistyNowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programisty
 
Iron Python I Dlr
Iron Python I DlrIron Python I Dlr
Iron Python I Dlr
 
Jak nie zwariować z tymi pakietami
Jak nie  zwariować z tymi pakietamiJak nie  zwariować z tymi pakietami
Jak nie zwariować z tymi pakietami
 
Pascal. Ćwiczenia praktyczne
Pascal. Ćwiczenia praktycznePascal. Ćwiczenia praktyczne
Pascal. Ćwiczenia praktyczne
 
Pascal. Ćwiczenia praktyczne
Pascal. Ćwiczenia praktycznePascal. Ćwiczenia praktyczne
Pascal. Ćwiczenia praktyczne
 
Wprowadzenie do technologii Puppet
Wprowadzenie do technologii PuppetWprowadzenie do technologii Puppet
Wprowadzenie do technologii Puppet
 
PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...
PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...
PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z...
 
Bootloadery i programy bare metal.
Bootloadery i programy bare metal.Bootloadery i programy bare metal.
Bootloadery i programy bare metal.
 

More from Mikołaj Olszewski

More from Mikołaj Olszewski (10)

Optoelektroniczne sieci neuronowe
Optoelektroniczne sieci neuronoweOptoelektroniczne sieci neuronowe
Optoelektroniczne sieci neuronowe
 
Swiatłowodowy czujnik prądu
Swiatłowodowy czujnik prąduSwiatłowodowy czujnik prądu
Swiatłowodowy czujnik prądu
 
Metody efektywnego łączenia sieci neuronowych
Metody efektywnego łączenia sieci neuronowychMetody efektywnego łączenia sieci neuronowych
Metody efektywnego łączenia sieci neuronowych
 
Parallel quicksort cz. 1
Parallel quicksort cz. 1Parallel quicksort cz. 1
Parallel quicksort cz. 1
 
Maszyna Turinga
Maszyna TuringaMaszyna Turinga
Maszyna Turinga
 
Planowanie działań cz. 2
Planowanie działań cz. 2Planowanie działań cz. 2
Planowanie działań cz. 2
 
Planowanie działań cz. 1
Planowanie działań cz. 1Planowanie działań cz. 1
Planowanie działań cz. 1
 
Model hierarchiczny
Model hierarchicznyModel hierarchiczny
Model hierarchiczny
 
Komputer genetyczny
Komputer genetycznyKomputer genetyczny
Komputer genetyczny
 
Test wyszukiwarek internetowych
Test wyszukiwarek internetowychTest wyszukiwarek internetowych
Test wyszukiwarek internetowych
 

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