dfdfdf
Dependency Injection frameworky v Jave Dagi, Čeven, 2009
Agenda 1. Intro 2. Inversion of control 3. Co by měl DI framework zvládnout 4. Srovnání vybraných DI frameworků 5. Q&A 20 September 201920 September 2019
Intro
9/20/2019 For internal use only -- not for distribution
Martin Fowler Refactoring Continuous integration Inversion of Control 9/20/2019 For internal use only -- not for distribution
Timeline http://www.picocontainer.org/inversion-of-control-history.html 20 September 201920 September 2019
Inversion of Control
Programy před zavedením IoC 9/20/2019 For internal use only -- not for distribution
Programy po zavedení IoC 20 September 201920 September 2019
Komponenty a jejich vazby 20 September 201920 September 2019
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; 20 September 201920 September 2019
Know Your Enemy private void init () { LocalBookStore localBookStore = new LocalBookStore(); localBookStore.setPath("/home/johndoe/data.xml"); setBookService(localBookStore); } 20 September 201920 September 2019
Generalizace problému Kde najít Jak získat Jak zkonfigurovat Jak spojit dohromady 20 September 201920 September 2019
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 20 September 201920 September 2019
Service locator 20 September 201920 September 2019
Dependency Injection 20 September 201920 September 2019
Service locator vs. DI Preferujte DI Service locator Žádné těsné vazby Transparentní No singleton hell Service locator body napojení Servlet Controller aplikace 20 September 201920 September 2019
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 20 September 201920 September 2019
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 20 September 201920 September 2019
Jak najít obrázky pro prezentaci 20 September 201920 September 2019
20 September 201920 September 2019
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) 20 September 201920 September 2019
Řízení vzniku komponent Uvnitř kontextu Delegace Factory, Fctory metod Mimo kontext Deserializace komponenty Web či ORM framework Proč Legacy kód, 3rd party knihovny 20 September 201920 September 2019
Řízené pořadí vzniku Proč Nepřímé závislosti Zajištění explicitního pořadí inicializace 20 September 201920 September 2019
Ž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 20 September 201920 September 2019
Další Programový přístup ke komponentám Jednoduchá testovatelnost Proč Vstupní bod aplikace Kód, který si není vědom obrácené kontroly Legacy, Integrace s 3party knihovnami Jednoduchá testovatelnost Efektivita vývoje Facebook, Twitter, Freevideo… 20 September 201920 September 2019
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 20 September 201920 September 2019
20 September 201920 September 2019
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 20 September 201920 September 2019
20 September 201920 September 2019
Questions?