Transcript
Page 1: Dependency Injection Frameworky
Page 2: 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

Page 3: Dependency Injection Frameworky

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

Page 4: Dependency Injection Frameworky

Intro

Page 5: Dependency Injection Frameworky

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

Page 6: Dependency Injection Frameworky

Martin Fowler• Refactoring• Continuous integration• Inversion of Control

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

Page 8: Dependency Injection Frameworky

Inversion of Control

Page 9: Dependency Injection Frameworky

Programy před zavedením IoC

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

Page 10: Dependency Injection Frameworky

Programy po zavedení IoC

10 April 12, 2023

Page 11: Dependency Injection Frameworky

Komponenty a jejich vazby

11 April 12, 2023

Page 12: Dependency Injection Frameworky

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; }}

Page 13: Dependency Injection Frameworky

Know Your Enemy

13 April 12, 2023

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

Page 14: Dependency Injection Frameworky

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

14 April 12, 2023

Page 15: Dependency Injection Frameworky

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

Page 16: Dependency Injection Frameworky

Service locator

16 April 12, 2023

Page 17: Dependency Injection Frameworky

Dependency Injection

17 April 12, 2023

Page 18: Dependency Injection Frameworky

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

Page 19: Dependency Injection Frameworky

Co by měl DI framework zvládnout

Page 20: Dependency Injection Frameworky

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

Page 21: Dependency Injection Frameworky

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

Page 22: Dependency Injection Frameworky

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

Page 23: Dependency Injection Frameworky

Jak najít obrázky pro prezentaci

23 April 12, 2023

Page 24: Dependency Injection Frameworky

24 April 12, 2023

Page 25: Dependency Injection Frameworky

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

Page 26: Dependency Injection Frameworky

Ří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

Page 27: Dependency Injection Frameworky

Ří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

Page 28: Dependency Injection Frameworky

Ž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

Page 29: Dependency Injection Frameworky

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

Page 30: Dependency Injection Frameworky

Srovnání vybraných DI frameworků

Page 31: Dependency Injection Frameworky

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

Page 32: Dependency Injection Frameworky

32 April 12, 2023

Page 33: Dependency Injection Frameworky

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

Page 34: Dependency Injection Frameworky

34 April 12, 2023

Page 35: Dependency Injection Frameworky

Questions?

Page 36: Dependency Injection Frameworky

Technology for better business outcomes


Top Related