dependency injection mönster - jfokus · dependency injection mönster peter norrhall 2009-01-28...

31
Dependency Injection mönster Peter Norrhall

Upload: others

Post on 18-Aug-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

Dependency Injection

mönster

Peter Norrhall

Page 2: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Konsumenter & TjänsterKonsument

«interface»

Tjänst

TjänstImpl

«realize»

behov

«interface»

Transport

«interface»

Mat«interface»

Mobil

Page 3: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Tjänstemäklarna - IoC Ramverk

Page 4: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Injection

• Tre signifikanta

public Tonåring(Mobil mobil)

public void setMobil(Mobil mobil)

Mobil mobil;

Page 5: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Constructor Injection (Guice)

public class Spädbarn extends AbstractHuman

{

@Inject

public Spädbarn(Blöja, Välling, Kärlek)

{

...

}

...

}

Page 6: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Constructor Injection

public class Tonåring extends Spädbarn {

@Inject

public Tonåring(Mobil, Sova, Kompisar,

Kärlek) {

...

}

...

}

Page 7: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Constructor Injection (Spring)<bean id=”tonårsmobil" class="com.tele2.services.Abonnemang">

<property name=”abonnemang"><ref local=”kontaktKort"/></property>

<property name=”mobiltelefon"><ref local=”iPhone"/></property>

</bean>

<!– Constructor injection -->

<bean id=”tonåring" class=”god.model.human.Tonåring">

<constructor-arg ref=”tonårsmobil"></constructor-arg>

<constructor-arg ref=”säng"></constructor-arg>

...

</bean>

Page 8: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Constructor Explosion

Vuxen extends Tonåring {

@Inject

public Vuxen(MeningenMedLivet, Kärlek,

Familj, Jobb, Träna, Bil, Hus,

FamiljeMiddagar, Sommarsemester,

Vintersemester, ...) {

...

}

...

}

Page 9: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Constructor vs Setter• Constructor

– Tydlighet

– Inga sidoeffekter

– Lättmockat

– Lätt att veta om/när

objektet är redo att

använda

• Setter/Field

– Enkelhet

– Default Constructor

– Sidoeffekter

Page 10: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

ScopeSingleton

No-Scope

Liv/

Odödlig

Gifta

Page 11: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Scope

• Singleton (Cache)

– Per Injector

• No-Scope

• Domain Specific

– Web - Session, Request, Flash, Conversation

• Custom Scope

Page 12: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Lifecycle Management

Eager

Lazy

Start/Stop

Replace/Unload

Page 13: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Lifecycle

• Lifecycle management covers

– Loadtime

• Eager

• Lazy

• Replacing / unloading

– Execution (of active objects)

• Starting

• Stopping

Page 14: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Moduler

Page 15: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-281505.02.2009

Tapestry 5 Module

Serv iceImpl

«interface»

Service

«realize»

Service A Service B

Service C

Module

ModuleBuilder

public class HumanModule {

public static void bind(ServiceBinder binder) {

binder.bind(Mobil.class, IphoneMobil.class).withId(”Mobil”);

}

}

Page 16: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Guice

Injector

Registry

Module[] modules = {new GuiceModule()};

Injector injector = Guice.createInjector(modules);

MailService service = injector.getInstance(MailService.class);

Module[] modules = {new GuiceModule()};

Injector injector = Guice.createInjector(modules);

MailService service = injector.getInstance(MailService.class);

Module[] modules = {new GuiceModule()};

Injector injector = Guice.createInjector(modules);

MailService service = injector.getInstance(MailService.class);

Page 17: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-281705.02.2009

Tapestry 5

Registry

RegistryBuilder

RegistryBuilder builder = new RegistryBuilder();

builder.add(TapestryModule.class);

Registry registry = builder.build();

registry.performRegistryStartup();

OrderManager orderManager = registry.getService(OrderManager.class);

Page 18: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-281805.02.2009

Tapestry 5

Registry

RegistryBuilder

RegistryBuilder builder = new RegistryBuilder();

builder.add(TapestryModule.class);

Registry registry = builder.build();

registry.performRegistryStartup();

OrderManager orderManager = registry.getService(OrderManager.class);

Page 19: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-281905.02.2009

Tapestry 5

Registry

RegistryBuilder

RegistryBuilder builder = new RegistryBuilder();

builder.add(TapestryModule.class);

Registry registry = builder.build();

registry.performRegistryStartup();

OrderManager orderManager = registry.getService(OrderManager.class);

Page 20: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-282005.02.2009

Tapestry 5

Registry

RegistryBuilder

RegistryBuilder builder = new RegistryBuilder();

builder.add(TapestryModule.class);

Registry registry = builder.build();

registry.performRegistryStartup();

OrderManager orderManager = registry.getService(OrderManager.class);

Page 21: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Lager

Page 22: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

ATG DynamoDAS

DPS

DCS

epoint epointws

Manifest-Version: 1.0

ATG-Required: epoint

>startdynamo –m epointws

Page 23: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Guice 2 Lagerkonfiguration

Module combinedModule

= Guice.overrideModule(new DCSModule(), new EpointModule());

Page 24: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Assembler

• Guice – Injector

• Tapestry – Registry

• Spring – ApplicationContext/BeanFactory

Page 25: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Konfiguration

• Externt (XML, .properties)

• Kod (POJO, Annoteringar)

Page 26: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Aspekter

«interface»

BetalaSkatt

Page 27: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-282705.02.2009

Tapestry IoC Decorators (”AOP”)Service A

Consumer

public class Consumer {

Service service;

...

ServiceImpl serviceImpl = (ServiceImpl)service;

}

«interface»

Service

+ callMe() : void

Serv iceImpl

+ callMe() : void

«realize»

Page 28: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-282805.02.2009

Tapestry IoC Decorators (”AOP”)

Service A

Consumer

«interface»

Service

+ callMe() : void

Serv iceImpl

+ callMe() : void

«decorator»

Proxy

+ callMe() : void

«realize»«realize»

Page 29: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

AOP

• Guice/Tapestry - Proxy/Interceptor

• Spring – AOP Proxy/Advice

• Qi4j – Concerns

– SideEffects

Page 30: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Advice

”Learn at least one new IoC framework every year”

Peter Norrhall

”Learn at least one new programming language every year”

Andrew Hunt & David Thomas

Page 31: Dependency Injection mönster - Jfokus · Dependency Injection mönster Peter Norrhall 2009-01-28 Konsumenter & Tjänster Konsument ©LQWHUIDFH ª 7MlQVW 7MlQVW,PSO ©UHDOL]Hª behov

2009-01-28

Avslutande Frågor

[email protected]