11. Automatyzacja obsługi komponentów Automatyczne wiazanie
Wiazanie po nazwie
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=” He 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=” power ” 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” a u t owi r e=”byName
”>
4 <p r o p e r t y name=”name” v a l u e=” He r c u l e s ” />
5 </ bean>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 7 / 41
12. Automatyzacja obsługi komponentów Automatyczne wiazanie
Wiazanie po nazwie
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=” He 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=” power ” 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” a u t owi r e=”byName
”>
4 <p r o p e r t y name=”name” v a l u e=” He r c u l e s ” />
5 </ bean>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 7 / 41
13. Automatyzacja obsługi komponentów Automatyczne wiazanie
Wiazanie po typie
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” a u t owi r e=” byType
”>
4 <p r o p e r t y name=”name” v a l u e=” He r c u l e s ” />
5 </ bean>
Jak sobie radzic z mnogoscia implementacji?
primary="false"
autowire-candidate="false"
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 8 / 41
14. Automatyzacja obsługi komponentów Automatyczne wiazanie
Wiazanie po typie
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” a u t owi r e=” byType
”>
4 <p r o p e r t y name=”name” v a l u e=” He r c u l e s ” />
5 </ bean>
Jak sobie radzic z mnogoscia implementacji?
primary="false"
autowire-candidate="false"
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 8 / 41
15. Automatyzacja obsługi komponentów Automatyczne wiazanie
Pozostałe rodzaje wiazan
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” a u t owi r e=”
c o n s t r u c t o r ” />
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” a u t owi r e=”
a u t o d e t e c t ” />
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 9 / 41
16. Automatyzacja obsługi komponentów Automatyczne wiazanie
Pozostałe rodzaje wiazan
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” a u t owi r e=”
c o n s t r u c t o r ” />
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” a u t owi r e=”
a u t o d e t e c t ” />
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 9 / 41
17. Automatyzacja obsługi komponentów Automatyczne wiazanie
Dodatkowe mozliwosci wiazan
Domyslny rodzaj wiazania (w pliku)
<beans ... default-autowire="<type>" > ... </beans>
Nadpisywanie
jawna deklaracja argumentu
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 10 / 41
18. Automatyzacja obsługi komponentów Automatyczne wiazanie
Rozpoznawanie adnotacji
1 <? xml v e r s i o n=” 1 . 0 ” enc oding=”UTF−8” ?>
2 <beans xmlns=” h t t p : //www. s p r i n g f r amewo r k . org / schema / beans ”
3 xml n s : x s i=” h t t p : //www.w3 . org /2001/XMLSchema−i n s t a n c e ”
4 xml n s : c o n t e x t=” h t t p : //www. s p r i n g f r amewo r k . org / schema / c o n t e x t
”
5 x s i : s c h ema L o c a t i o n=” h t t p : //www. s p r i n g f r amewo r k . org / schema /
beans
6 h t t p : //www. s p r i n g f r amewo r k . org / schema / beans / s p r i n g−beans
−3.0. xsd
7 h t t p : //www. s p r i n g f r amewo r k . org / schema / c o n t e x t
8 h t t p : //www. s p r i n g f r amewo r k . org / schema / c o n t e x t / s p r i n g−
cont e x t −3.0. xsd ”>
9
10 <c o n t e x t : a n n o t a t i o n −c o n f i g />
11
12 <!−− d e k l a r a c j a z i a r e n −−>
13
14 </ beans>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 11 / 41
19. Automatyzacja obsługi komponentów Automatyczne wiazanie
@Autowired
1 @Autowired // byType
2 p u b l i c void setPower ( Power power ) f
3 t h i s . power = power ;
4 g
1 @Autowired // byType
2 p u b l i c void ustawMiMoc ( Power power ) f
3 t h i s . power = power ;
4 g
1 @Autowired // c o n s t r u c t o r
2 p u b l i c DemiGod ( Power power ) f
3 t h i s . power = power ;
4 g
1 @Autowired ( r e q u i r e d=f a l s e ) // byType
2 p r i v a t e Power power ;
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 12 / 41
20. Automatyzacja obsługi komponentów Automatyczne wiazanie
@Autowired
1 @Autowired // byType
2 p u b l i c void setPower ( Power power ) f
3 t h i s . power = power ;
4 g
1 @Autowired // byType
2 p u b l i c void ustawMiMoc ( Power power ) f
3 t h i s . power = power ;
4 g
1 @Autowired // c o n s t r u c t o r
2 p u b l i c DemiGod ( Power power ) f
3 t h i s . power = power ;
4 g
1 @Autowired ( r e q u i r e d=f a l s e ) // byType
2 p r i v a t e Power power ;
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 12 / 41
21. Automatyzacja obsługi komponentów Automatyczne wiazanie
@Autowired
1 @Autowired // byType
2 p u b l i c void setPower ( Power power ) f
3 t h i s . power = power ;
4 g
1 @Autowired // byType
2 p u b l i c void ustawMiMoc ( Power power ) f
3 t h i s . power = power ;
4 g
1 @Autowired // c o n s t r u c t o r
2 p u b l i c DemiGod ( Power power ) f
3 t h i s . power = power ;
4 g
1 @Autowired ( r e q u i r e d=f a l s e ) // byType
2 p r i v a t e Power power ;
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 12 / 41
22. Automatyzacja obsługi komponentów Automatyczne wiazanie
@Autowired
1 @Autowired // byType
2 p u b l i c void setPower ( Power power ) f
3 t h i s . power = power ;
4 g
1 @Autowired // byType
2 p u b l i c void ustawMiMoc ( Power power ) f
3 t h i s . power = power ;
4 g
1 @Autowired // c o n s t r u c t o r
2 p u b l i c DemiGod ( Power power ) f
3 t h i s . power = power ;
4 g
1 @Autowired ( r e q u i r e d=f a l s e ) // byType
2 p r i v a t e Power power ;
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 12 / 41
23. Automatyzacja obsługi komponentów Automatyczne wiazanie
@Autowired + @Qualifier
1 @Autowired
2 @Qu a l i f i e r ( ” s t r e n g t h ” ) // byName++
3 p r i v a t e Power power ;
1 <bean i d=” s t r e n g t h ” c l a s s=”pk . demo . s p r i n g . EnormousStrength ”/>
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 <q u a l i f i e r v a l u e=” s t r e n g t h ” />
3 </ bean>
1 @Qu a l i f i e r ( ” s t r e n g t h ” )
2 @Qu a l i f i e r ( ” b o r r i n g ” )
3 p u b l i c c l a s s EnormousStrength implements Power f
4 . . .
5 g
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 13 / 41
24. Automatyzacja obsługi komponentów Automatyczne wiazanie
@Autowired + @Qualifier
1 @Autowired
2 @Qu a l i f i e r ( ” s t r e n g t h ” ) // byName++
3 p r i v a t e Power power ;
1 <bean i d=” s t r e n g t h ” c l a s s=”pk . demo . s p r i n g . EnormousStrength ”/>
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 <q u a l i f i e r v a l u e=” s t r e n g t h ” />
3 </ bean>
1 @Qu a l i f i e r ( ” s t r e n g t h ” )
2 @Qu a l i f i e r ( ” b o r r i n g ” )
3 p u b l i c c l a s s EnormousStrength implements Power f
4 . . .
5 g
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 13 / 41
25. Automatyzacja obsługi komponentów Automatyczne wiazanie
@Autowired + @Qualifier
1 @Autowired
2 @Qu a l i f i e r ( ” s t r e n g t h ” ) // byName++
3 p r i v a t e Power power ;
1 <bean i d=” s t r e n g t h ” c l a s s=”pk . demo . s p r i n g . EnormousStrength ”/>
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 <q u a l i f i e r v a l u e=” s t r e n g t h ” />
3 </ bean>
1 @Qu a l i f i e r ( ” s t r e n g t h ” )
2 @Qu a l i f i e r ( ” b o r r i n g ” )
3 p u b l i c c l a s s EnormousStrength implements Power f
4 . . .
5 g
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 13 / 41
26. Automatyzacja obsługi komponentów Automatyczne wiazanie
@Autowired + @Qualifier
1 @Autowired
2 @Qu a l i f i e r ( ” s t r e n g t h ” ) // byName++
3 p r i v a t e Power power ;
1 <bean i d=” s t r e n g t h ” c l a s s=”pk . demo . s p r i n g . EnormousStrength ”/>
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 <q u a l i f i e r v a l u e=” s t r e n g t h ” />
3 </ bean>
1 @Qu a l i f i e r ( ” s t r e n g t h ” )
2 @Qu a l i f i e r ( ” b o r r i n g ” )
3 p u b l i c c l a s s EnormousStrength implements Power f
4 . . .
5 g
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 13 / 41
27. Automatyzacja obsługi komponentów Automatyczne wiazanie
Własny kwalifikator
1 @Target (f ElementType . FIELD , ElementType .PARAMETER, ElementType .TYPE
g)
2 @Re t ent ion ( Re t e n t i o nPo l i c y .RUNTIME)
3 @Qu a l i f i e r
4 p u b l i c @i n t e r f a c e StrengthPower f g
1 @StrengthPower
2 p u b l i c c l a s s EnormousStrength implements Power f
3 . . .
4 g
1 @Autowired
2 @StrengthPower
3 p r i v a t e Power power ;
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 14 / 41
28. Automatyzacja obsługi komponentów Automatyczne wiazanie
Własny kwalifikator
1 @Target (f ElementType . FIELD , ElementType .PARAMETER, ElementType .TYPE
g)
2 @Re t ent ion ( Re t e n t i o nPo l i c y .RUNTIME)
3 @Qu a l i f i e r
4 p u b l i c @i n t e r f a c e StrengthPower f g
1 @StrengthPower
2 p u b l i c c l a s s EnormousStrength implements Power f
3 . . .
4 g
1 @Autowired
2 @StrengthPower
3 p r i v a t e Power power ;
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 14 / 41
29. Automatyzacja obsługi komponentów Automatyczne wiazanie
Własny kwalifikator
1 @Target (f ElementType . FIELD , ElementType .PARAMETER, ElementType .TYPE
g)
2 @Re t ent ion ( Re t e n t i o nPo l i c y .RUNTIME)
3 @Qu a l i f i e r
4 p u b l i c @i n t e r f a c e StrengthPower f g
1 @StrengthPower
2 p u b l i c c l a s s EnormousStrength implements Power f
3 . . .
4 g
1 @Autowired
2 @StrengthPower
3 p r i v a t e Power power ;
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 14 / 41
30. Automatyzacja obsługi komponentów Automatyczne wiazanie
@Value
1 @Value ( ” He r k u l e s ” )
2 p r i v a t e S t r i n g name ;
1 @Value ( ”#fs y s t emPr o p e r t i e s . heroNameg” )
2 p r i v a t e S t r i n g name ;
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 15 / 41
31. Automatyzacja obsługi komponentów Automatyczne wiazanie
@Value
1 @Value ( ” He r k u l e s ” )
2 p r i v a t e S t r i n g name ;
1 @Value ( ”#fs y s t emPr o p e r t i e s . heroNameg” )
2 p r i v a t e S t r i n g name ;
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 15 / 41
32. Automatyzacja obsługi komponentów Automatyczne definiowanie
Skanowanie komponentów
1 <? xml v e r s i o n=” 1 . 0 ” enc oding=”UTF−8” ?>
2 <beans xmlns=” h t t p : //www. s p r i n g f r amewo r k . org / schema / beans ”
3 xml n s : x s i=” h t t p : //www.w3 . org /2001/XMLSchema−i n s t a n c e ”
4 xml n s : c o n t e x t=” h t t p : //www. s p r i n g f r amewo r k . org / schema / c o n t e x t
”
5 x s i : s c h ema L o c a t i o n=” h t t p : //www. s p r i n g f r amewo r k . org / schema /
beans
6 h t t p : //www. s p r i n g f r amewo r k . org / schema / beans / s p r i n g−beans
−3.0. xsd
7 h t t p : //www. s p r i n g f r amewo r k . org / schema / c o n t e x t
8 h t t p : //www. s p r i n g f r amewo r k . org / schema / c o n t e x t / s p r i n g−
cont e x t −3.0. xsd ”>
9
10 <cont e x t : component−scan base−package=”pk . demo . s p r i n g ” />
11 <!−− z automatu c o n t e x t : a n n o t a t i o n −c o n f i g −−>
12
13 <!−− d e k l a r a c j a z i a r e n −−>
14
15 </ beans>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 16 / 41
34. Automatyzacja obsługi komponentów Automatyczne definiowanie
Definiowanie komponentów
1 @Component // name == enormousSt r ength
2 p u b l i c EnormousStrength implements Power f
3 . . .
4 g
1 @Component ( ” h e r c u l e s ” ) // name == h e r c u l e s
2 p u b l i c DemiGod implements Hero f
3 . . .
4 g
1 @Component
2 @Qu a l i f i e r ( ” c a r t o o n ” )
3 @Scope ( ” p r o t o t y p e ” )
4 p u b l i c SuperHero implements Hero f
5 . . .
6 g
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 18 / 41
35. Automatyzacja obsługi komponentów Automatyczne definiowanie
Definiowanie komponentów
1 @Component // name == enormousSt r ength
2 p u b l i c EnormousStrength implements Power f
3 . . .
4 g
1 @Component ( ” h e r c u l e s ” ) // name == h e r c u l e s
2 p u b l i c DemiGod implements Hero f
3 . . .
4 g
1 @Component
2 @Qu a l i f i e r ( ” c a r t o o n ” )
3 @Scope ( ” p r o t o t y p e ” )
4 p u b l i c SuperHero implements Hero f
5 . . .
6 g
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 18 / 41
36. Automatyzacja obsługi komponentów Automatyczne definiowanie
Definiowanie komponentów
1 @Component // name == enormousSt r ength
2 p u b l i c EnormousStrength implements Power f
3 . . .
4 g
1 @Component ( ” h e r c u l e s ” ) // name == h e r c u l e s
2 p u b l i c DemiGod implements Hero f
3 . . .
4 g
1 @Component
2 @Qu a l i f i e r ( ” c a r t o o n ” )
3 @Scope ( ” p r o t o t y p e ” )
4 p u b l i c SuperHero implements Hero f
5 . . .
6 g
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 18 / 41
37. Automatyzacja obsługi komponentów Automatyczne definiowanie
Filtrowanie zakresu skanowania
annotation
assignable
aspectj
custom
regex
1 <cont e x t : component−scan base−package=”pk . demo . s p r i n g ”>
2 <c o n t e x t : i n c l u d e −f i l t e r t ype=” a s s i g n a b l e ”
3 e x p r e s s i o n=”pk . demo . s p r i n g . Power ”/>
4 <c o n t e x t : e x c l u d e −f i l t e r t ype=” a n n o t a t i o n ”
5 e x p r e s s i o n=”pk . demo . s p r i n g . S k i p I t ”/>
6 </ cont e x t : component−scan>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 19 / 41
38. Automatyzacja obsługi komponentów Automatyczne definiowanie
Filtrowanie zakresu skanowania
annotation
assignable
aspectj
custom
regex
1 <cont e x t : component−scan base−package=”pk . demo . s p r i n g ”>
2 <c o n t e x t : i n c l u d e −f i l t e r t ype=” a s s i g n a b l e ”
3 e x p r e s s i o n=”pk . demo . s p r i n g . Power ”/>
4 <c o n t e x t : e x c l u d e −f i l t e r t ype=” a n n o t a t i o n ”
5 e x p r e s s i o n=”pk . demo . s p r i n g . S k i p I t ”/>
6 </ cont e x t : component−scan>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 19 / 41
40. Programowanie aspektowe
Plan wykładu
1 Automatyzacja obsługi komponentów
Automatyczne wiazanie
Automatyczne definiowanie
2 Programowanie aspektowe
Wprowadzenie do Spring AOP
Deklarowanie aspektów
3 Podsumowanie
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 21 / 41
41. Programowanie aspektowe
O co tyle chałasu?
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 22 / 41
42. Programowanie aspektowe Wprowadzenie do Spring AOP
Czym jest programowanie aspektowe?
Pomocnicze funkcjonalnosci
przekrojowe
OOP
dziedziczenie
delegacja
AOP
implementacja w jednym
miejscu
modularyzacja w aspekty
opis, gdzie i jak uzyc
główna funkcjonalnosc nie jest
zasmiecona
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 23 / 41
43. Programowanie aspektowe Wprowadzenie do Spring AOP
Podstawowa terminologia
Advice (rada) — odczyt licznika
(before, after, after-returning,
after-throwing, around)
Join points (punkty złaczen) —
wszelkie urzadzenia elektryczne
Pointcuts (punkty interakcji) —
lista liczników (i domów)
Aspect = Advice + Pointcuts
Introduction (wprowadzenie)
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 24 / 41
44. Programowanie aspektowe Wprowadzenie do Spring AOP
Podstawowa terminologia
Advice (rada) — odczyt licznika
(before, after, after-returning,
after-throwing, around)
Join points (punkty złaczen) —
wszelkie urzadzenia elektryczne
Pointcuts (punkty interakcji) —
lista liczników (i domów)
Aspect = Advice + Pointcuts
Introduction (wprowadzenie)
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 24 / 41
45. Programowanie aspektowe Wprowadzenie do Spring AOP
Podstawowa terminologia
Advice (rada) — odczyt licznika
(before, after, after-returning,
after-throwing, around)
Join points (punkty złaczen) —
wszelkie urzadzenia elektryczne
Pointcuts (punkty interakcji) —
lista liczników (i domów)
Aspect = Advice + Pointcuts
Introduction (wprowadzenie)
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 24 / 41
46. Programowanie aspektowe Wprowadzenie do Spring AOP
Podstawowa terminologia
Advice (rada) — odczyt licznika
(before, after, after-returning,
after-throwing, around)
Join points (punkty złaczen) —
wszelkie urzadzenia elektryczne
Pointcuts (punkty interakcji) —
lista liczników (i domów)
Aspect = Advice + Pointcuts
Introduction (wprowadzenie)
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 24 / 41
47. Programowanie aspektowe Wprowadzenie do Spring AOP
Podstawowa terminologia
Advice (rada) — odczyt licznika
(before, after, after-returning,
after-throwing, around)
Join points (punkty złaczen) —
wszelkie urzadzenia elektryczne
Pointcuts (punkty interakcji) —
lista liczników (i domów)
Aspect = Advice + Pointcuts
Introduction (wprowadzenie)
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 24 / 41
49. Programowanie aspektowe Wprowadzenie do Spring AOP
Tworzenie punktów interakcji
struktura
1 e x e c u t i o n (* pk . demo . s p r i n g . Power . use ( . . )
2 && wi t h i n ( pk . demo . s p r i n g . c a r t o o n s . * )
3 and ! bean ( spiderMan ) )
args(), @args()
execution()
this()
target(), @target()
within(), @within()
@annotation()
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 26 / 41
50. Programowanie aspektowe Wprowadzenie do Spring AOP
Tworzenie punktów interakcji
struktura
1 e x e c u t i o n (* pk . demo . s p r i n g . Power . use ( . . )
2 && wi t h i n ( pk . demo . s p r i n g . c a r t o o n s . * )
3 and ! bean ( spiderMan ) )
args(), @args()
execution()
this()
target(), @target()
within(), @within()
@annotation()
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 26 / 41
52. Programowanie aspektowe Deklarowanie aspektów
Reporter
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s Re p o r t e r f
4
5 // Be f o r e r e s c u e
6 p u b l i c void t a k eVi ewp o i n t ( ) f
7 System . out . p r i n t l n ( ”The r e p o r t e r i s t a k i n g p e r f e c t v i ewp o i n t ” ) ;
8 g
9 // Be f o r e r e s c u e
10 p u b l i c void prepareCamera ( ) f
11 System . out . p r i n t l n ( ”The r e p o r t e r i s p r e p a r i n g camera f o r t a k i n g
photos ” ) ;
12 g
13 // Af t e r r e s c u e
14 p u b l i c void w r i t e A r t i c l e ( ) f
15 System . out . p r i n t l n ( ”The r e p o r t e r i s wr i t i n g a r t i c l e ” ) ;
16 g
17 // Af t e r f a i l e d r e s c u e
18 p u b l i c void e s c ape ( ) f
19 System . out . p r i n t l n ( ”The r e p o r t e r s c r eams : Help me ! ” ) ;
20 g
21 g
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 28 / 41
53. Programowanie aspektowe Deklarowanie aspektów
Zatrudnienie reportera I
1 <bean i d=” r e p o r t e r ” c l a s s=”pk . demo . s p r i n g . Re p o r t e r ” />
2
3 <a o p : c o n f i g>
4 <a o p : a s p e c t r e f=” r e p o r t e r ”>
5 <a o p : b e f o r e p o i n t c u t=” e x e c u t i o n (* pk . demo . s p r i n g . Hero . r e s c u e
( . . ) ) ” method=” t a k eVi ewp o i n t ” />
6 <a o p : b e f o r e p o i n t c u t=” e x e c u t i o n (* pk . demo . s p r i n g . Hero . r e s c u e
( . . ) ) ” method=” prepareCamera ” />
7 <a o p : a f t e r −r e t u r n i n g p o i n t c u t=” e x e c u t i o n (* pk . demo . s p r i n g . Hero .
r e s c u e ( . . ) ) ” method=” w r i t e A r t i c l e ” />
8 <a o p : a f t e r −thr owing p o i n t c u t=” e x e c u t i o n (* pk . demo . s p r i n g . Hero .
r e s c u e ( . . ) ) ” method=” e s c ape ” />
9 </ a o p : a s p e c t>
10 </ a o p : c o n f i g>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 29 / 41
54. Programowanie aspektowe Deklarowanie aspektów
Zatrudnienie reportera II
1 <bean i d=” r e p o r t e r ” c l a s s=”pk . demo . s p r i n g . Re p o r t e r ” />
2
3 <a o p : c o n f i g>
4 <a o p : a s p e c t r e f=” r e p o r t e r ”>
5 <a o p : p o i n t c u t i d=” r e s c u e ” e x p r e s s i o n=” e x e c u t i o n (* pk . demo . s p r i n g
. Hero . r e s c u e ( . . ) ) ” />
6 <a o p : b e f o r e p o i n t c u t−r e f=” r e s c u e ” method=” t a k eVi ewp o i n t ” />
7 <a o p : b e f o r e p o i n t c u t−r e f=” r e s c u e ” method=” prepareCamera ” />
8 <a o p : a f t e r −r e t u r n i n g p o i n t c u t−r e f=” r e s c u e ” method=” w r i t e A r t i c l e
” />
9 <a o p : a f t e r −thr owing p o i n t c u t−r e f=” r e s c u e ” method=” e s c ape ” />
10 </ a o p : a s p e c t>
11 </ a o p : c o n f i g>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 30 / 41
55. Programowanie aspektowe Deklarowanie aspektów
Jak reporter (współ-)pracuje?
logika biznesowa aspekt logika aspektowa
try f
<aop:before ...
method="takeViewpoint"/> reporter.takeViewpoint();
<aop:before ...
method="prepareCamera"/> reporter.prepareCamera();
hero.rescue()
<aop:after-returning ...
method="writeArticle"/> reporter.writeArticle();
g catch(Exception e) f
<aop:after-throwing ...
method="escape"/> reporter.escape();
g
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 31 / 41
56. Programowanie aspektowe Deklarowanie aspektów
Sprytny reporter
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s Smar tRepor t e r f
4
5 p u b l i c void o b s e r v e ( Pr o c e e d i n g J o i nPo i n t j o i n p o i n t ) f
6 t r y f
7 System . out . p r i n t l n ( ”The r e p o r t e r i s t a k i n g p e r f e c t v i ewp o i n t ”
) ;
8 System . out . p r i n t l n ( ”The r e p o r t e r i s p r e p a r i n g camera f o r
t a k i n g photos ” ) ;
9
10 wh i l e ( ! takeGoodPhoto ( ) ) f
11 j o i n p o i n t . proc e ed ( ) ;
12 g
13
14 System . out . p r i n t l n ( ”The r e p o r t e r i s wr i t i n g a r t i c l e ” ) ;
15 g catch ( Ex c e p t i o n e ) f
16 System . out . p r i n t l n ( ”The r e p o r t e r s c r eams : Help me ! ” ) ;
17 g
18 g
19 g
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 32 / 41
57. Programowanie aspektowe Deklarowanie aspektów
Zatrudnienie sprytnego reportera
1 <bean i d=” r e p o r t e r ” c l a s s=”pk . demo . s p r i n g . Smar tRepor t e r ” />
2
3 <a o p : c o n f i g>
4 <a o p : a s p e c t r e f=” r e p o r t e r ”>
5 <a o p : p o i n t c u t i d=” r e s c u e ” e x p r e s s i o n=” e x e c u t i o n (* pk . demo . s p r i n g
. Hero . r e s c u e ( . . ) ) ” />
6 <aop: a round p o i n t c u t−r e f=” r e s c u e ” method=” o b s e r v e ” />
7 </ a o p : a s p e c t>
8 </ a o p : c o n f i g>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 33 / 41
58. Programowanie aspektowe Deklarowanie aspektów
Przekazywanie parametru
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 Thinke r f
4 void thinkOfSome thing ( S t r i n g thought s ) ;
5 g
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s Magician f
4 p u b l i c void i n t e r c e p tTh o u g h t s ( S t r i n g thought s ) f
5 System . out . p r i n t l n ( ” Vo l u n t e e r t h i n k s about ’ thought s ’ ” ) ;
6 g
7 g
1 <a o p : c o n f i g>
2 <a o p : a s p e c t r e f=”magi c i an ”>
3 <a o p : p o i n t c u t i d=” t h i n k i n g ” e x p r e s s i o n=” e x e c u t i o n (* pk . demo .
s p r i n g . Thinke r . thinkOfSome thing ( S t r i n g ) ) and a r g s ( thought s ) ”
/>
4 <a o p : b e f o r e p o i n t c u t−r e f=” t h i n k i n g ” method=” i n t e r c e p tTh o u g h t s ”
arg−names=” thought s ” />
5 </ a o p : a s p e c t>
6 <M/ikaołoajpO:lsczeownskfi i(gW>ZIM SGGW) Programowanie Komponentowe Wykład #B 34 / 41
59. Programowanie aspektowe Deklarowanie aspektów
Przekazywanie parametru
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 Thinke r f
4 void thinkOfSome thing ( S t r i n g thought s ) ;
5 g
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s Magician f
4 p u b l i c void i n t e r c e p tTh o u g h t s ( S t r i n g thought s ) f
5 System . out . p r i n t l n ( ” Vo l u n t e e r t h i n k s about ’ thought s ’ ” ) ;
6 g
7 g
1 <a o p : c o n f i g>
2 <a o p : a s p e c t r e f=”magi c i an ”>
3 <a o p : p o i n t c u t i d=” t h i n k i n g ” e x p r e s s i o n=” e x e c u t i o n (* pk . demo .
s p r i n g . Thinke r . thinkOfSome thing ( S t r i n g ) ) and a r g s ( thought s ) ”
/>
4 <a o p : b e f o r e p o i n t c u t−r e f=” t h i n k i n g ” method=” i n t e r c e p tTh o u g h t s ”
arg−names=” thought s ” />
5 </ a o p : a s p e c t>
6 <M/ikaołoajpO:lsczeownskfi i(gW>ZIM SGGW) Programowanie Komponentowe Wykład #B 34 / 41
60. Programowanie aspektowe Deklarowanie aspektów
Przekazywanie parametru
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 Thinke r f
4 void thinkOfSome thing ( S t r i n g thought s ) ;
5 g
1 package pk . demo . s p r i n g ;
2
3 p u b l i c c l a s s Magician f
4 p u b l i c void i n t e r c e p tTh o u g h t s ( S t r i n g thought s ) f
5 System . out . p r i n t l n ( ” Vo l u n t e e r t h i n k s about ’ thought s ’ ” ) ;
6 g
7 g
1 <a o p : c o n f i g>
2 <a o p : a s p e c t r e f=”magi c i an ”>
3 <a o p : p o i n t c u t i d=” t h i n k i n g ” e x p r e s s i o n=” e x e c u t i o n (* pk . demo .
s p r i n g . Thinke r . thinkOfSome thing ( S t r i n g ) ) and a r g s ( thought s ) ”
/>
4 <a o p : b e f o r e p o i n t c u t−r e f=” t h i n k i n g ” method=” i n t e r c e p tTh o u g h t s ”
arg−names=” thought s ” />
5 </ a o p : a s p e c t>
6 <M/ikaołoajpO:lsczeownskfi i(gW>ZIM SGGW) Programowanie Komponentowe Wykład #B 34 / 41
62. Programowanie aspektowe Deklarowanie aspektów
Wprowadzenie nowej funkcjonalnosci
Co to przypomina?
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 36 / 41
63. Programowanie aspektowe Deklarowanie aspektów
Wprowadzenie nowej funkcjonalnosci
Co to przypomina?
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 36 / 41
64. Programowanie aspektowe Deklarowanie aspektów
Domieszkowanie
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 S t o r yTe l l e r f
4 p u b l i c S t r i n g t e l lTh e S t o r y ( ) ;
5 g
1 <a o p : c o n f i g>
2 <a o p : d e c l a r e −p a r e n t s
3 t ype s−matching=”pk . demo . s p r i n g . Hero+”
4 implement−i n t e r f a c e=”pk . demo . s p r i n g . S t o r yTe l l e r ”
5 d e f a u l t−impl=”pk . demo . s p r i n g . F a n t a s i s t ” />
6 </ a o p : c o n f i g>
1 <bean i d=” f a n t a s i s t ” c l a s s=”pk . demo . s p r i n g . F a n t a s i s t ” />
2 <a o p : c o n f i g>
3 <a o p : d e c l a r e −p a r e n t s
4 t ype s−matching=”pk . demo . s p r i n g . Hero+”
5 implement−i n t e r f a c e=”pk . demo . s p r i n g . S t o r yTe l l e r ”
6 d e l e g a t e−r e f=” f a n t a s i s t ” />
7 </ a o p : c o n f i g>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 37 / 41
65. Programowanie aspektowe Deklarowanie aspektów
Domieszkowanie
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 S t o r yTe l l e r f
4 p u b l i c S t r i n g t e l lTh e S t o r y ( ) ;
5 g
1 <a o p : c o n f i g>
2 <a o p : d e c l a r e −p a r e n t s
3 t ype s−matching=”pk . demo . s p r i n g . Hero+”
4 implement−i n t e r f a c e=”pk . demo . s p r i n g . S t o r yTe l l e r ”
5 d e f a u l t−impl=”pk . demo . s p r i n g . F a n t a s i s t ” />
6 </ a o p : c o n f i g>
1 <bean i d=” f a n t a s i s t ” c l a s s=”pk . demo . s p r i n g . F a n t a s i s t ” />
2 <a o p : c o n f i g>
3 <a o p : d e c l a r e −p a r e n t s
4 t ype s−matching=”pk . demo . s p r i n g . Hero+”
5 implement−i n t e r f a c e=”pk . demo . s p r i n g . S t o r yTe l l e r ”
6 d e l e g a t e−r e f=” f a n t a s i s t ” />
7 </ a o p : c o n f i g>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 37 / 41
66. Programowanie aspektowe Deklarowanie aspektów
Domieszkowanie
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 S t o r yTe l l e r f
4 p u b l i c S t r i n g t e l lTh e S t o r y ( ) ;
5 g
1 <a o p : c o n f i g>
2 <a o p : d e c l a r e −p a r e n t s
3 t ype s−matching=”pk . demo . s p r i n g . Hero+”
4 implement−i n t e r f a c e=”pk . demo . s p r i n g . S t o r yTe l l e r ”
5 d e f a u l t−impl=”pk . demo . s p r i n g . F a n t a s i s t ” />
6 </ a o p : c o n f i g>
1 <bean i d=” f a n t a s i s t ” c l a s s=”pk . demo . s p r i n g . F a n t a s i s t ” />
2 <a o p : c o n f i g>
3 <a o p : d e c l a r e −p a r e n t s
4 t ype s−matching=”pk . demo . s p r i n g . Hero+”
5 implement−i n t e r f a c e=”pk . demo . s p r i n g . S t o r yTe l l e r ”
6 d e l e g a t e−r e f=” f a n t a s i s t ” />
7 </ a o p : c o n f i g>
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 37 / 41
67. Podsumowanie
Plan wykładu
1 Automatyzacja obsługi komponentów
Automatyczne wiazanie
Automatyczne definiowanie
2 Programowanie aspektowe
Wprowadzenie do Spring AOP
Deklarowanie aspektów
3 Podsumowanie
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 38 / 41
68. Podsumowanie
Podsumowanie
Automatyczne rozwiazywanie zaleznosci z mozliwoscia konfiguracji
Skanowanie w poszukiwaniu komponentów z mozliwoscia
doprecyzowania rodzaju i filtrowaniem
Grupowanie przekrojowych funkcjonalnosci za pomoca aspektów
Wprowadzanie nowych funkcjonalnosci za pomoca domieszek
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 39 / 41
69. Podsumowanie
Do domu
Przeczytac rozdziały 3, 4 ze „Spring w Akcji” (3. lub 4. ed.)
W praktyce zapoznac sie z adnotacjami i aspektami springowymi
Poznac funkcjonalnosc interfejsów JoinPoint i
ProceedingJoinPoint
Komponenty w javie
jak na poprzednie zajecia
interfejsy w pakiecie pk.labs.LabB.Contracts
automatyczna rejestracja przez springa
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #B 40 / 41