1
6
6
Jerzy R. Jaworowski,
Jerzy R. Jaworowski,
dr in
dr in
ż
ż
.
.
Instytut Teleinformatyki PK
Instytut Teleinformatyki PK
Zaawansowane techniki
Zaawansowane techniki
programowania
programowania
2013 / 2014
2013 / 2014
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
2
2
6
6
Dependency
Dependency
Injection
Injection
(DI)
(DI)
Zrozumienie problemu, kt
Zrozumienie problemu, kt
ó
ó
ry DI pomaga
ry DI pomaga
rozwi
rozwi
ą
ą
za
za
ć
ć
wymaga wcze
wymaga wcze
ś
ś
niejszego
niejszego
poznania dw
poznania dw
ó
ó
ch koncepcji
ch koncepcji
1.
1.
Dependency
Dependency
Injection
Injection
Principle
Principle
(DIP)
(DIP)
2.
2.
Inversion
Inversion
of
of
Control
Control
(
(
IoC
IoC
)
)
Znajomo
Znajomo
ść
ść
tych poj
tych poj
ęć
ęć
stwarza dobry
stwarza dobry
punkt wyj
punkt wyj
ś
ś
cia do om
cia do om
ó
ó
wienia
wienia
szczeg
szczeg
ó
ó
ł
ł
ó
ó
w DI oraz analizowania
w DI oraz analizowania
metod implementacji
metod implementacji
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
3
3
6
6
Dependency
Dependency
Injection
Injection
Principle
Principle
Jest to jedna z zasad projektowania
Jest to jedna z zasad projektowania
software
software
’
’
u
u
,
,
kt
kt
ó
ó
ra wskazuje nam jak tworzy
ra wskazuje nam jak tworzy
ć
ć
lu
lu
ź
ź
no
no
powi
powi
ą
ą
zane klasy
zane klasy
1.
1.
Modu
Modu
ł
ł
y wy
y wy
ż
ż
szego poziomu nie powinny
szego poziomu nie powinny
zale
zale
ż
ż
e
e
ć
ć
bezpo
bezpo
ś
ś
rednio od modu
rednio od modu
ł
ł
ó
ó
w poziomu
w poziomu
ni
ni
ż
ż
szego. Powinny zale
szego. Powinny zale
ż
ż
e
e
ć
ć
od
od
‘
‘
abstrakcji
abstrakcji
’
’
2.
2.
Abstrakcje nie powinny zale
Abstrakcje nie powinny zale
ż
ż
e
e
ć
ć
od
od
szczeg
szczeg
ó
ó
ł
ł
ó
ó
w
w
–
–
szczeg
szczeg
ó
ó
ł
ł
y maj
y maj
ą
ą
zale
zale
ż
ż
e
e
ć
ć
od
od
abstrakcji
abstrakcji
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
4
4
6
6
Dependency
Dependency
Injection
Injection
Principle
Principle
class
class
EventLogger
EventLogger
{
{
public
public
void
void
write(String
write(String
message
message
) {
) {
//
//
write
write
to
to
event
event
log
log
here
here
}
}
}
}
class
class
AppPoolMonitor
AppPoolMonitor
{
{
// Handle to
// Handle to
EventLog
EventLog
writer
writer
to
to
write
write
to
to
the
the
logs
logs
EventLogger
EventLogger
writer
writer
=
=
null
null
;
;
//
//
This
This
function
function
will be
will be
called
called
when
when
the
the
app
app
pool
pool
has
has
problem
problem
public
public
void
void
Notify
Notify
(
(
String
String
message
message
) {
) {
if
if
(
(
writer
writer
==
==
null
null
) {
) {
writer
writer
=
=
new
new
EventLogger
EventLogger
();
();
}
}
writer.write(message
writer.write(message
);
);
}
}
}
}
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
5
5
6
6
Dependency
Dependency
Injection
Injection
Principle
Principle
Kod wygl
Kod wygl
ą
ą
da bardzo profesjonalnie lecz
da bardzo profesjonalnie lecz
narusza zasady DIP :
narusza zasady DIP :
Modu
Modu
ł
ł
wy
wy
ż
ż
szego poziomu
szego poziomu
AppPoolMonitor
AppPoolMonitor
zale
zale
ż
ż
y bezpo
y bezpo
ś
ś
rednio od
rednio od
EventLogger
EventLogger
, kt
, kt
ó
ó
ry
ry
jest konkretn
jest konkretn
ą
ą
klas
klas
ą
ą
, a nie abstrakcj
, a nie abstrakcj
ą
ą
W czym zatem tkwi rzeczywisty problem ?
W czym zatem tkwi rzeczywisty problem ?
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
6
6
6
6
Dependency
Dependency
Injection
Injection
Principle
Principle
Wraz z rozwojem projektu mo
Wraz z rozwojem projektu mo
ż
ż
e okaza
e okaza
ć
ć
si
si
ę
ę
potrzebnym dla pewnych rodzaj
potrzebnym dla pewnych rodzaj
ó
ó
w zdarze
w zdarze
ń
ń
wysy
wysy
ł
ł
anie dodatkowo informacji
anie dodatkowo informacji
’
’
em
em
, dla
, dla
innych
innych
SMS
SMS
’
’
em
em
. Utworzymy zatem kolejne
. Utworzymy zatem kolejne
modu
modu
ł
ł
y
y
class
class
EventMailLogger
EventMailLogger
{
{
public
public
void
void
send(String
send(String
message
message
) {
) {
//
//
send
send
notification
notification
here
here
}
}
}
}
class
class
EventSMSLogger
EventSMSLogger
{
{
public
public
void
void
send(String
send(String
message
message
) {
) {
//
//
send
send
SMS
SMS
notification
notification
here
here
}
}
}
}
2
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
7
7
6
6
Dependency
Dependency
Injection
Injection
Principle
Principle
A co zatem z modu
A co zatem z modu
ł
ł
em wy
em wy
ż
ż
szego poziomu ?
szego poziomu ?
class
class
AppPoolMonitor
AppPoolMonitor
{
{
EventLogger
EventLogger
writer
writer
=
=
null
null
;
;
EventMailLogger
EventMailLogger
mailSender
mailSender
=
=
null
null
;
;
EventSMSLogger
EventSMSLogger
smsSender
smsSender
=
=
null
null
;
;
LL
LL
.
.
}
}
Zwi
Zwi
ę
ę
kszyli
kszyli
ś
ś
my istotnie zale
my istotnie zale
ż
ż
no
no
ść
ść
modu
modu
ł
ł
u
u
monitora od modu
monitora od modu
ł
ł
ó
ó
w poziomu ni
w poziomu ni
ż
ż
szego !
szego !
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
8
8
6
6
Inversion
Inversion
of
of
Control
Control
Dependency
Dependency
Injection
Injection
Principle
Principle
jest zasad
jest zasad
ą
ą
projektowania
projektowania
software
software
’
’
u
u
, okre
, okre
ś
ś
laj
laj
ą
ą
ca regu
ca regu
ł
ł
y,
y,
kt
kt
ó
ó
rym winny odpowiada
rym winny odpowiada
ć
ć
powi
powi
ą
ą
zania mi
zania mi
ę
ę
dzy
dzy
modu
modu
ł
ł
ami.
ami.
Inversion
Inversion
of
of
Control
Control
jest mechanizmem, kt
jest mechanizmem, kt
ó
ó
ry
ry
mo
mo
ż
ż
emy wykorzysta
emy wykorzysta
ć
ć
dla tworzenia
dla tworzenia
powi
powi
ą
ą
zania modu
zania modu
ł
ł
ó
ó
w wy
w wy
ż
ż
szego poziomu z
szego poziomu z
u
u
ż
ż
yciem abstrakcji, miast konkretnych
yciem abstrakcji, miast konkretnych
implementacji modu
implementacji modu
ł
ł
ó
ó
w poziomu ni
w poziomu ni
ż
ż
szego.
szego.
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
9
9
6
6
Inversion
Inversion
of
of
Control
Control
A wi
A wi
ę
ę
c utw
c utw
ó
ó
rzmy abstrakcj
rzmy abstrakcj
ę
ę
, od kt
, od kt
ó
ó
rej modu
rej modu
ł
ł
wy
wy
ż
ż
szego poziomu (
szego poziomu (
AppPoolMonitor
AppPoolMonitor
) b
) b
ę
ę
dzie
dzie
zale
zale
ż
ż
a
a
ł
ł
:
:
public
public
interface
interface
INotification
INotification
{
{
public
public
void
void
onNotification(String
onNotification(String
message
message
);
);
}
}
Mo
Mo
ż
ż
na teraz zmodyfikowa
na teraz zmodyfikowa
ć
ć
odpowiednio modu
odpowiednio modu
ł
ł
AppPoolMonitor
AppPoolMonitor
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
10
10
6
6
Inversion
Inversion
of
of
Control
Control
class
class
AppPoolMonitor
AppPoolMonitor
{
{
// Handle to
// Handle to
EventLog
EventLog
writer
writer
to
to
write
write
to
to
the
the
logs
logs
INotification
INotification
action
action
=
=
null
null
;
;
//
//
This
This
function
function
will be
will be
called
called
when
when
the
the
app
app
pool
pool
//
//
has
has
problem
problem
public
public
void
void
notify(String
notify(String
message
message
) {
) {
if
if
(
(
action
action
!=
!=
null
null
) {
) {
action.onNotification(message
action.onNotification(message
);
);
}
}
}
}
}
}
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
11
11
6
6
Inversion
Inversion
of
of
Control
Control
Jak zatem zmieni
Jak zatem zmieni
ą
ą
si
si
ę
ę
modu
modu
ł
ł
y poziomu
y poziomu
ni
ni
ż
ż
szego ?
szego ?
class
class
EventLogger
EventLogger
implements
implements
INotification
INotification
{
{
public
public
void
void
onNotification(String
onNotification(String
message
message
) {
) {
write(message
write(message
);
);
}
}
private
private
void
void
write(String
write(String
message
message
) {
) {
//
//
write
write
to
to
event
event
log
log
here
here
}
}
}
}
Analogiczne zmiany nale
Analogiczne zmiany nale
ż
ż
y zaimplementowa
y zaimplementowa
ć
ć
w
w
EventMailLogger
EventMailLogger
i
i
EventSMSLogger
EventSMSLogger
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
12
12
6
6
Inversion
Inversion
of
of
Control
Control
Co tak naprawd
Co tak naprawd
ę
ę
zmieni
zmieni
ł
ł
o si
o si
ę
ę
w naszym
w naszym
projekcie ?
projekcie ?
W pierwotnej wersji modu
W pierwotnej wersji modu
ł
ł
AppPoolMonitor
AppPoolMonitor
zarz
zarz
ą
ą
dza
dza
ł
ł
(kontrolowa
(kontrolowa
ł
ł
), kt
), kt
ó
ó
ry z modu
ry z modu
ł
ł
ó
ó
w
w
ni
ni
ż
ż
szego poziomu ma by
szego poziomu ma by
ć
ć
wykonany.
wykonany.
W wersji zmodyfikowanej
W wersji zmodyfikowanej
AppPoolMonitor
AppPoolMonitor
wykonuje operacj
wykonuje operacj
ę
ę
komunikuj
komunikuj
ą
ą
c si
c si
ę
ę
z tym
z tym
modu
modu
ł
ł
em poziomu ni
em poziomu ni
ż
ż
szego, kt
szego, kt
ó
ó
ry zosta
ry zosta
ł
ł
okre
okre
ś
ś
lony
lony
‘
‘
poza nim
poza nim
’
’
(zmienna
(zmienna
action
action
!).
!).
Dzia
Dzia
ł
ł
a zatem wg regu
a zatem wg regu
ł
ł
okre
okre
ś
ś
lonych
lonych
zewn
zewn
ę
ę
trznie, st
trznie, st
ą
ą
d nazwa :
d nazwa :
Inversion
Inversion
of
of
Control
Control
(w skr
(w skr
ó
ó
cie
cie
IoC
IoC
)
)
3
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
13
13
6
6
Dependency
Dependency
Injection
Injection
Znamy zasad
Znamy zasad
ę
ę
projektowania zale
projektowania zale
ż
ż
no
no
ś
ś
ci
ci
pomi
pomi
ę
ę
dzy modu
dzy modu
ł
ł
ami (
ami (
Dependency
Dependency
Injection
Injection
Principle
Principle
) oraz metodologi
) oraz metodologi
ę
ę
implementowania umo
implementowania umo
ż
ż
liwiaj
liwiaj
ą
ą
c
c
ą
ą
zachowania
zachowania
tych zasad (
tych zasad (
Inversion
Inversion
of
of
Control
Control
).
).
Dependency
Dependency
Injection
Injection
jest mechanizmem
jest mechanizmem
umo
umo
ż
ż
liwiaj
liwiaj
ą
ą
cym dostarczenie (wstrzykni
cym dostarczenie (wstrzykni
ę
ę
cie)
cie)
do istniej
do istniej
ą
ą
cej implementacji klasy modu
cej implementacji klasy modu
ł
ł
u
u
wy
wy
ż
ż
szego poziomu referencji do konkretnej
szego poziomu referencji do konkretnej
implementacji modu
implementacji modu
ł
ł
u poziomu ni
u poziomu ni
ż
ż
szego.
szego.
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
14
14
6
6
Dependency
Dependency
Injection
Injection
class
class
AppPoolMonitor
AppPoolMonitor
{
{
INotification
INotification
action
action
=
=
null
null
;
;
public
public
void
void
notify(String
notify(String
message
message
) {
) {
if
if
(
(
action
action
!=
!=
null
null
) {
) {
action.onNotification(message
action.onNotification(message
);
);
}
}
}
}
}
}
W jaki spos
W jaki spos
ó
ó
b najbardziej prawid
b najbardziej prawid
ł
ł
owo
owo
dostarczy
dostarczy
ć
ć
informacj
informacj
ę
ę
do modu
do modu
ł
ł
u monitora o
u monitora o
interesuj
interesuj
ą
ą
cej nas konkretnej implementacji
cej nas konkretnej implementacji
modu
modu
ł
ł
u
u
loggera
loggera
? (inaczej m
? (inaczej m
ó
ó
wi
wi
ą
ą
c : jak
c : jak
zainicjowa
zainicjowa
ć
ć
warto
warto
ść
ść
zmiennej referencyjnej
zmiennej referencyjnej
action
action
?)
?)
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
15
15
6
6
Dependency
Dependency
Injection
Injection
Zasadnicza idea
Zasadnicza idea
Dependency
Dependency
Injection
Injection
sprowadza si
sprowadza si
ę
ę
do zmniejszenia zale
do zmniejszenia zale
ż
ż
no
no
ś
ś
ci
ci
pomi
pomi
ę
ę
dzy klasami i przeniesienia metody
dzy klasami i przeniesienia metody
wi
wi
ą
ą
zania abstrakcji i konkretnych
zania abstrakcji i konkretnych
implementacji
implementacji
‘
‘
na zewn
na zewn
ą
ą
trz nich
trz nich
’
’
.
.
Podstawowe techniki realizacji DI:
Podstawowe techniki realizacji DI:
1.
1.
Constructor
Constructor
Injection
Injection
2.
2.
Method
Method
Injection
Injection
3.
3.
Property
Property
Injection
Injection
4.
4.
Contextualized
Contextualized
Dependency
Dependency
Lookup
Lookup
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
16
16
6
6
Constructor
Constructor
Injection
Injection
class
class
AppPoolMonitor
AppPoolMonitor
{
{
// Handle to
// Handle to
EventLog
EventLog
writer
writer
to
to
write
write
to
to
the
the
logs
logs
INotification
INotification
action
action
=
=
null
null
;
;
public
public
AppPoolMonitor(INotification
AppPoolMonitor(INotification
concreteImpl
concreteImpl
) {
) {
action
action
=
=
concreteImpl
concreteImpl
;
;
}
}
//
//
This
This
function
function
will be
will be
called
called
when
when
the
the
app
app
pool
pool
//
//
has
has
problem
problem
public
public
void
void
notify(String
notify(String
message
message
) {
) {
if
if
(
(
action
action
!=
!=
null
null
) {
) {
action.onNotification(message
action.onNotification(message
);
);
}
}
}
}
}
}
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
17
17
6
6
Constructor
Constructor
Injection
Injection
Jak korzystamy w praktyce ?
Jak korzystamy w praktyce ?
AppPoolMonitor
AppPoolMonitor
monitor =
monitor =
new
new
AppPoolMonitor(new
AppPoolMonitor(new
EventLogger
EventLogger
());
());
monitor.notify("Sample
monitor.notify("Sample
message
message
to log");
to log");
AppPoolMonitor
AppPoolMonitor
monitor =
monitor =
new
new
AppPoolMonitor(new
AppPoolMonitor(new
EventMailLogger
EventMailLogger
());
());
monitor.notify("Sample
monitor.notify("Sample
message
message
to mail");
to mail");
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
18
18
6
6
Method
Method
Injection
Injection
class
class
AppPoolMonitor
AppPoolMonitor
{
{
// Handle to
// Handle to
EventLog
EventLog
writer
writer
to
to
write
write
to
to
the
the
logs
logs
INotification
INotification
action
action
=
=
null
null
;
;
//
//
This
This
function
function
will be
will be
called
called
when
when
the
the
app
app
pool
pool
//
//
has
has
problem
problem
public
public
void
void
notify(INotification
notify(INotification
concreteImpl
concreteImpl
,
,
String
String
message
message
) {
) {
action
action
=
=
concreteImpl
concreteImpl
;
;
if
if
(
(
action
action
!=
!=
null
null
) {
) {
action.onNotification(message
action.onNotification(message
);
);
}
}
}
}
}
}
4
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
19
19
6
6
Method
Method
Injection
Injection
Jak korzystamy w praktyce ?
Jak korzystamy w praktyce ?
AppPoolMonitor
AppPoolMonitor
monitor =
monitor =
new
new
AppPoolMonitor
AppPoolMonitor
();
();
monitor.notify(new
monitor.notify(new
EventLogger
EventLogger
(),
(),
"
"
Sample
Sample
message
message
to log");
to log");
AppPoolMonitor
AppPoolMonitor
monitor =
monitor =
new
new
AppPoolMonitor
AppPoolMonitor
();
();
monitor.notify(new
monitor.notify(new
EventSMSLogger
EventSMSLogger
(),
(),
"
"
Sample
Sample
message
message
to SMS");
to SMS");
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
20
20
6
6
Property
Property
Injection
Injection
class
class
AppPoolMonitor
AppPoolMonitor
{
{
// Handle to
// Handle to
EventLog
EventLog
writer
writer
to
to
write
write
to
to
the
the
logs
logs
INotification
INotification
action
action
=
=
null
null
;
;
public
public
void
void
setAction(INotification
setAction(INotification
concreteImpl
concreteImpl
) {
) {
action
action
=
=
concreteImpl
concreteImpl
;
;
}
}
//
//
This
This
function
function
will be
will be
called
called
when
when
the
the
app
app
pool
pool
//
//
has
has
problem
problem
public
public
void
void
notify(String
notify(String
message
message
) {
) {
if
if
(
(
action
action
!=
!=
null
null
) {
) {
action.onNotification(message
action.onNotification(message
);
);
}
}
}
}
}
}
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
21
21
6
6
Property
Property
Injection
Injection
Jak korzystamy w praktyce ?
Jak korzystamy w praktyce ?
AppPoolMonitor
AppPoolMonitor
monitor =
monitor =
new
new
AppPoolMonitor
AppPoolMonitor
();
();
monitor.setAction(new
monitor.setAction(new
EventLogger
EventLogger
());
());
monitor.notify("Sample
monitor.notify("Sample
message
message
to log");
to log");
AppPoolMonitor
AppPoolMonitor
monitor =
monitor =
new
new
AppPoolMonitor
AppPoolMonitor
();
();
monitor.setAction(new
monitor.setAction(new
EventSMSLogger
EventSMSLogger
());
());
monitor.notify("Sample
monitor.notify("Sample
message
message
to SMS");
to SMS");
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
22
22
6
6
Contextualized
Contextualized
Dependency
Dependency
Lookup
Lookup
class
class
AppPoolMonitor
AppPoolMonitor
{
{
// Handle to
// Handle to
EventLog
EventLog
writer
writer
to
to
write
write
to
to
the
the
logs
logs
INotification
INotification
action
action
=
=
null
null
;
;
public
public
void
void
doLookup(Context
doLookup(Context
context
context
) {
) {
try
try
{
{
action
action
= (
= (
INotification)context.lookup(
INotification)context.lookup(
”
”
myAction
myAction
”
”
);
);
}
}
catch
catch
(
(
NamingException
NamingException
ne
ne
) {}
) {}
}
}
//
//
This
This
function
function
will be
will be
called
called
when
when
the
the
app
app
pool
pool
//
//
has
has
problem
problem
public
public
void
void
notify(String
notify(String
message
message
) {
) {
if
if
(
(
action
action
!=
!=
null
null
) {
) {
action.onNotification(message
action.onNotification(message
);
);
}
}
}
}
}
}
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
23
23
6
6
Contextualized
Contextualized
Dependency
Dependency
Lookup
Lookup
Jak korzystamy w praktyce ?
Jak korzystamy w praktyce ?
AppPoolMonitor
AppPoolMonitor
monitor =
monitor =
new
new
AppPoolMonitor
AppPoolMonitor
();
();
monitor.setAction(new
monitor.setAction(new
InitialContext
InitialContext
());
());
monitor.notify("Sample
monitor.notify("Sample
message
message
to log");
to log");
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
24
24
6
6
Factory
Factory
Pattern
Pattern
vs
vs
.
.
Dependency
Dependency
Injection
Injection
Class
Class
A {
A {
private
private
C
C
obj
obj
;
;
public
public
void
void
method
method
() {
() {
...
...
this.obj
this.obj
=
=
MyObjectFactory.getC
MyObjectFactory.getC
();
();
...
...
}
}
}
}
Kontrakt:
Kontrakt:
Wybierz instancj
Wybierz instancj
ę
ę
C w
C w
ł
ł
a
a
ś
ś
ciw
ciw
ą
ą
do
do
wykonania zadania
wykonania zadania
Odpowiedzialno
Odpowiedzialno
ść
ść
za wyb
za wyb
ó
ó
r C:
r C:
Po stronie obiektu
Po stronie obiektu
implementuj
implementuj
ą
ą
cego klas
cego klas
ę
ę
A
A
Class
Class
A {
A {
private
private
C
C
obj
obj
;
;
public
public
void
void
method(C
method(C
obj
obj
) {
) {
...
...
this.obj
this.obj
=
=
obj
obj
;
;
...
...
}
}
}
}
Kontrakt:
Kontrakt:
Dostarcz instancj
Dostarcz instancj
ę
ę
C w
C w
ł
ł
a
a
ś
ś
ciw
ciw
ą
ą
do
do
wykonania zadania
wykonania zadania
Odpowiedzialno
Odpowiedzialno
ść
ść
za wyb
za wyb
ó
ó
r C:
r C:
Po stronie osoby decyduj
Po stronie osoby decyduj
ą
ą
cej
cej
‘
‘
z
z
zewn
zewn
ą
ą
trz
trz
’
’
5
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
25
25
6
6
IoC
IoC
Container
Container
Ka
Ka
ż
ż
da z om
da z om
ó
ó
wionych metod
wionych metod
Dependency
Dependency
Injection
Injection
jest
jest
ł
ł
atwa do
atwa do
zaimplementowania i czytelna w
zaimplementowania i czytelna w
przypadku, gdy w projekcie wyst
przypadku, gdy w projekcie wyst
ę
ę
puje
puje
jeden poziom zale
jeden poziom zale
ż
ż
no
no
ś
ś
ci pomi
ci pomi
ę
ę
dzy
dzy
modu
modu
ł
ł
ami.
ami.
Jak post
Jak post
ą
ą
pi
pi
ć
ć
w sytuacji, gdy konkretne
w sytuacji, gdy konkretne
implementacje same zale
implementacje same zale
żą
żą
od
od
abstrakcji kolejnego (ni
abstrakcji kolejnego (ni
ż
ż
szego) poziomu
szego) poziomu
klas (modu
klas (modu
ł
ł
ó
ó
w) ?
w) ?
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
26
26
6
6
IoC
IoC
Container
Container
Je
Je
ż
ż
eli projekt wymaga
eli projekt wymaga
ł
ł
a
a
ń
ń
cuchowania
cuchowania
i/lub zagnie
i/lub zagnie
ż
ż
d
d
ż
ż
ania zale
ania zale
ż
ż
no
no
ś
ś
ci,
ci,
implementacja staje si
implementacja staje si
ę
ę
zwykle istotnie
zwykle istotnie
skomplikowana.
skomplikowana.
Rozwi
Rozwi
ą
ą
zaniem (wsparciem
zaniem (wsparciem
technologicznym) s
technologicznym) s
ą
ą
kontenery
kontenery
IoC
IoC
,
,
kt
kt
ó
ó
re umo
re umo
ż
ż
liwiaj
liwiaj
ą
ą
‘
‘
zewn
zewn
ę
ę
trzne
trzne
’
’
(z
(z
u
u
ż
ż
yciem plik
yciem plik
ó
ó
w konfiguracyjnych w
w konfiguracyjnych w
formacie
formacie
xml
xml
) mapowanie wzajemnych
) mapowanie wzajemnych
powi
powi
ą
ą
za
za
ń
ń
pomi
pomi
ę
ę
dzy modu
dzy modu
ł
ł
ami.
ami.
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
27
27
6
6
Spring
Spring
Framework
Framework
Projekt realizowany w oparciu o niezale
Projekt realizowany w oparciu o niezale
ż
ż
ne
ne
klasy/modu
klasy/modu
ł
ł
y istotnie zwi
y istotnie zwi
ę
ę
ksza mo
ksza mo
ż
ż
liwo
liwo
ś
ś
ci
ci
ponownego u
ponownego u
ż
ż
ycia kodu (
ycia kodu (
reusability
reusability
) oraz
) oraz
u
u
ł
ł
atwia proces testowania.
atwia proces testowania.
Spring
Spring
Framework
Framework
u
u
ł
ł
atwia programi
atwia programi
ś
ś
cie
cie
korzystanie z mechanizm
korzystanie z mechanizm
ó
ó
w wstrzykiwania
w wstrzykiwania
zale
zale
ż
ż
no
no
ś
ś
ci zapewniaj
ci zapewniaj
ą
ą
c standardowe
c standardowe
rozwi
rozwi
ą
ą
zania w zakresie konfigurowania i
zania w zakresie konfigurowania i
zarz
zarz
ą
ą
dzania referencjami do tworzonych
dzania referencjami do tworzonych
obiekt
obiekt
ó
ó
w.
w.
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
28
28
6
6
Spring
Spring
Framework
Framework
Podstawow
Podstawow
ą
ą
funkcjonalno
funkcjonalno
ś
ś
ci
ci
ą
ą
frameworku
frameworku
jest
jest
dostarczenie przez
dostarczenie przez
Spring
Spring
Container
Container
(Spring
(Spring
IoC
IoC
Container
Container
) mechanizmu
) mechanizmu
Dependency
Dependency
Injection
Injection
.
.
Kontener umo
Kontener umo
ż
ż
liwia wstrzykiwanie potrzebnych
liwia wstrzykiwanie potrzebnych
obiekt
obiekt
ó
ó
w (czytaj : referencji do obiekt
w (czytaj : referencji do obiekt
ó
ó
w) do
w) do
innych obiekt
innych obiekt
ó
ó
w. To umo
w. To umo
ż
ż
liwia projektowanie
liwia projektowanie
klas Javy w spos
klas Javy w spos
ó
ó
b zapewniaj
b zapewniaj
ą
ą
cy lu
cy lu
ź
ź
ne
ne
powi
powi
ą
ą
zanie pomi
zanie pomi
ę
ę
dzy obiektami.
dzy obiektami.
Klasy Java zarz
Klasy Java zarz
ą
ą
dzane przez Spring musz
dzane przez Spring musz
ą
ą
odpowiada
odpowiada
ć
ć
standardowi
standardowi
JavaBean
JavaBean
.
.
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
29
29
6
6
Zalety DI
Zalety DI
•
•
Lu
Lu
ź
ź
no powi
no powi
ą
ą
zane elementy architektury
zane elementy architektury
programu
programu
•
•
Separacja odpowiedzialno
Separacja odpowiedzialno
ś
ś
ci
ci
•
•
Konfiguracja i kod s
Konfiguracja i kod s
ą
ą
od siebie niezale
od siebie niezale
ż
ż
ne
ne
•
•
Zmiana konfiguracji umo
Zmiana konfiguracji umo
ż
ż
liwia stworzenie
liwia stworzenie
‘
‘
innego rozwi
innego rozwi
ą
ą
zania
zania
’
’
bez ingerowania w kod
bez ingerowania w kod
implementacji
implementacji
•
•
Testowanie mo
Testowanie mo
ż
ż
e by
e by
ć
ć
realizowane z
realizowane z
wykorzystaniem techniki
wykorzystaniem techniki
mock
mock
objects
objects
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
30
30
6
6
Dla zainteresowanych
Dla zainteresowanych
L
L
Martin Fowler
Martin Fowler
„
„
Inversion
Inversion
of
of
Control
Control
Containers
Containers
and
and
the
the
Dependency
Dependency
Injection
Injection
pattern
pattern
”
”
http
http
://
://
martinfowler.com
martinfowler.com
/
/
articles
articles
/
/
injection.html
injection.html
6
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
31
31
6
6
Chwila na refleksj
Chwila na refleksj
ę
ę
...
...
•
•
Czy dowiedzia
Czy dowiedzia
ł
ł
e
e
ś
ś
si
si
ę
ę
czego
czego
ś
ś
nowego ?
nowego ?
•
•
Czy dowiedzia
Czy dowiedzia
ł
ł
e
e
ś
ś
si
si
ę
ę
czego
czego
ś
ś
Twym zdaniem
Twym zdaniem
wa
wa
ż
ż
nego ?
nego ?
•
•
Czy dostrzegasz zwi
Czy dostrzegasz zwi
ą
ą
zek i przydatno
zek i przydatno
ść
ść
przekazanych tre
przekazanych tre
ś
ś
ci w zawodzie, kt
ci w zawodzie, kt
ó
ó
ry sobie
ry sobie
wybra
wybra
ł
ł
e
e
ś
ś
?
?
•
•
Masz ewentualne uwagi b
Masz ewentualne uwagi b
ą
ą
d
d
ź
ź
sugestie,
sugestie,
podziel si
podziel si
ę
ę
nimi ...
nimi ...
jrj@pk.edu.pl
jrj@pk.edu.pl
2014
2014
-
-
02
02
-
-
06
06
©
©
2014, Jerzy R. Jaworowski
2014, Jerzy R. Jaworowski
32
32
6
6
Dzi
Dzi
ę
ę
kuj
kuj
ę
ę
za uwag
za uwag
ę
ę