Post on 25-May-2015
description
© 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
Timeline
7 April 12, 2023
http://www.picocontainer.org/inversion-of-control-history.html
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