Dependency Injection Frameworky

Post on 25-May-2015

2.597 views 1 download

description

Prezentace na tema Dependency inejction frameworky v Jave.

Transcript of Dependency Injection Frameworky

© 2008 Hewlett-Packard Development Company, L.P.The information contained herein is subject to change without notice

Dependency Injection frameworky v Jave

Dagi, Čeven, 2009

3 April 12, 2023

Agenda

1. Intro

3. Co by měl DI framework zvládnout

2. Inversion of control

4. Srovnání vybraných DI frameworků

5. Q&A

Intro

5 04/12/2023 For internal use only -- not for distribution

Martin Fowler• Refactoring• Continuous integration• Inversion of Control

6 04/12/2023 For internal use only -- not for distribution

Inversion of Control

Programy před zavedením IoC

9 04/12/2023 For internal use only -- not for distribution

Programy po zavedení IoC

10 April 12, 2023

Komponenty a jejich vazby

11 April 12, 2023

12 April 12, 2023

public class ReservationService { private BookService bookService; public ReservationService() { init(); }

private void init () { LocalBookStore localBookStore = new LocalBookStore(); localBookStore.setPath("/home/johndoe/data.xml"); setBookService(localBookStore); } public boolean reserveBook(long bookId, Date from,Date to,User u) { Book book = bookService.getBook(bookId); //kod vlastní rezervace vynechan }

public void setBookService(BookService bookService) { this.bookService=bookService; }}

Know Your Enemy

13 April 12, 2023

private void init () { LocalBookStore localBookStore = new LocalBookStore(); localBookStore.setPath("/home/johndoe/data.xml"); setBookService(localBookStore); }

Generalizace problému• Kde najít• Jak získat• Jak zkonfigurovat• Jak spojit dohromady

14 April 12, 2023

Obrácená kontrola• „…vychází z principu přenesení

odpovědnosti za nalezení, konfiguraci a spojení komponent dohromady na někoho třetího“

• Indirekce == volné vazby (loosely coupled)−Znovupoužitelnost−Lepší testovatelnost−Extenzibilita

• Dvě možné implementace−Přímé závislosti na prostředníkovi−Nepřímé závislosti na prostředníkovi

15 April 12, 2023

Service locator

16 April 12, 2023

Dependency Injection

17 April 12, 2023

Service locator vs. DI• Preferujte DI

−Žádné těsné vazby−Transparentní−No singleton hell

• Service locator−body napojení

• Servlet• Controller aplikace

18 April 12, 2023

Co by měl DI framework zvládnout

Minimální možná míra invaze• Invazivnost

−Jak moc je ještě komponenta POJO• Co je invazivní

−Implementace rozhraní−Odvození komponenty od specifické třídy

frameworku−Nemožnost používat základní programové

konstrukty• finální třídy• konstruktory s parametrem

• Proč−Návrhové a implementační kompromisy

Podpora základních typů realizace DI• Constructor injection

−Bezpečnější, Přehlednější−Nepovinné závislosti, Cyklické závislosti (proxy)

• Setter injection−Nepovinné či velké množství závislostí−Chybějící závislosti (@Required)

• Field injection−Jednoduchý zápis−Netransparentní

• Proč−Pro různé případy se hodí různé přístupy

21 April 12, 2023

Metadata pro popis komponent• Anotace

−Jednoduchý zápis−Zapečené na úrovni kódu

• XML−Ukecané−Lze měnít v deployment time−Konfigurovatelné komponenty (vazba na

infrastrukturu)• Proč

−Obvykle oba typy komponent v aplikace

22 April 12, 2023

Jak najít obrázky pro prezentaci

23 April 12, 2023

24 April 12, 2023

Reference mezi komponentami• Typem

−Bezpečnější (Teoreticky)• Jedna instance komponenty

−Sběr podle typu• Extenzibilita s volnou vazbou

• Symbolickým jménem−Více instancí stejného rozhraní−Variabilnější skládání

• XML

• Proč−Testování (mock objecty se stejným rozhraním)

25 April 12, 2023

Řízení vzniku komponent• Uvnitř kontextu

−Delegace• Factory, Fctory metod

• Mimo kontext−Deserializace komponenty−Web či ORM framework

• Proč−Legacy kód, 3rd party knihovny

26 April 12, 2023

Řízené pořadí vzniku• Proč

−Nepřímé závislosti−Zajištění explicitního pořadí inicializace

27 April 12, 2023

Client DependencyInjector

getComponentA

readMetadata

ComponentA ComponentB ComponentC

new

getComponentC

init

null

new

setComponentB

Životní cyklus komponent• Jedna instance komponenty

−Singleton• Nová instance komponenty

−Prototyp• Konverzační instance komponenty

−HTTP request, HTTP session atd.• Proč

−Implementační detail komponenty−Web aplikace

28 April 12, 2023

Další• Programový přístup ke komponentám

−Proč• Vstupní bod aplikace• Kód, který si není vědom obrácené kontroly

−Legacy, Integrace s 3party knihovnami

• Jednoduchá testovatelnost−Proč

• Efektivita vývoje−Facebook, Twitter, Freevideo…

29 April 12, 2023

Srovnání vybraných DI frameworků

Dependency injection frameworky• Embedded frameworky

−PicoContainer 2.8−Google Guice 2.0

• Aplikační frameworky−JBoss Microcontainer 2.0.6 GA−Spring framework 2.5.x

• Standard−Apache OpenEJB 3.0

31 April 12, 2023

32 April 12, 2023

Java Contexts and Dependency Injection (JSR-299)• WebBeans• Myths

−JSR-299 is just for EJBs−JSR-299 is tied to JSF−JSR-299 is tied to heavyweight Java EE

containers−JSR-299 uses a lot of annotations

33 April 12, 2023

34 April 12, 2023

Questions?

Technology for better business outcomes