background image

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

ó

ó

ł

ł

ó

ó

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 

email

email

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

email 

email 

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

}

}

background image

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

ł

ł

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

ć

ć

EventMailLogger

EventMailLogger

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

ł

ł

ó

ó

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

)

)

background image

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

ł

ł

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

ł

ł

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

); 

); 

}

}

}

}

background image

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

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

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 

zewn

zewn

ą

ą

trz

trz

background image

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

background image

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

ę

ę