Základy Guice Vazby Scopes. Google Guice. základní seznámení s frameworkem Google Guice

Podobné dokumenty
Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Spring framework 2.0. Roman Pichlík CZJUG

Další vlastnosti Springu Moduly Springu. Spring Framework. Pavel Mička. Pavel Mička Spring Framework 1/18

IoC/DI. Tomáš Herceg Microsoft MVP (ASP.NET)

UJO Framework. revoluční architektura beans. verze

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Návrhové vzory Tvorba objektů

Úvod do programovacích jazyků (Java)

1. Programování proti rozhraní

Spring Framework Handout

RMI Remote Method Invocation

KIV/PIA 2013 Jan Tichava

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Tvorba informačních systémů

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Enterprise Java Beans 3.0

NOVINKY V JEE EJB 3.1. Zdeněk Troníček Fakulta informačních technologií ČVUT v Praze

Java a XML. 10/26/09 1/7 Java a XML

Generické programování

OSGi. Aplikační programování v Javě (BI-APJ) - 6 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Výčtový typ strana 67

State. Známý jako. Účel. Použitelnost. Stav, Object for States. umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu

GWT pro pokročilé. MoroSystems, s.r.o. Pavel Klobása. Senior Java Developer.

Lambda funkce Novinky v interfaces Streamy Optional - aneb zbavujeme se null. Java 8. Ondřej Hrstka

JAVA. Java Management Extensions JMX

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

RMI - Distribuované objekty v Javě

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Java a Caché IV: Manipulace s objekty

Programování v Javě I. Únor 2009

Remote Method Invocation RMI

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

IRAE 07/08 Přednáška č. 1

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

typová konverze typová inference

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Programování v Javě I. Leden 2008

8 Třídy, objekty, metody, předávání argumentů metod

GTL GENERATOR NÁSTROJ PRO GENEROVÁNÍ OBJEKTŮ OBJEKTY PRO INFORMATICA POWERCENTER. váš partner na cestě od dat k informacím

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Seminář Java II p.1/43

Distribuované systémy a výpočty

Technology Entry form Entry up-to-date? Internal links Faulty internal Possible internal links

Návrhové vzory OMO, LS 2014/2015

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Reflexe. Aplikační programování v Javě (BI-APJ) - 8 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

IRAE 07/08 Přednáška č. 7. Začátek (head)

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Dědičnost (inheritance)

Komponenty v.net. Obsah přednášky

Základy objektové orientace I. Únor 2010

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

[ASP].NET Core Demystified. Miroslav Holec. Konzultant a lektor [ASP].NET Core.

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

Základy programovaní 3 - Java. Unit testy. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. 26.,27.

1. Dědičnost a polymorfismus

Snadný vývoj webových aplikací s Nette. Lukáš Jelínek

Kód, který se nebude často měnit

Programovací jazyk Java

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Jakub Čermák Microsoft Student Partner

Z. Kotala, P. Toman: Java ( Obsah )

PREPROCESOR POKRAČOVÁNÍ

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Programování v C++ 2, 4. cvičení

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Abstraktní datové typy: zásobník

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

Jazyk C# (seminář 6)

Teoretické minimum z PJV

20. Projekt Domácí mediotéka

Michal Podzimek

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Anotace a Hibernate. Aleš Nosek Ondřej Vadinský Daniel Krátký

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Návrhové vzory Design Patterns

PŘETĚŽOVÁNÍ OPERÁTORŮ

Java Výjimky Java, zimní semestr

Algoritmizace a programování. Terminálový vstup a výstup

17. Projekt Trojúhelníky

X33EJA Web Services. Martin Ptáček, KOMIX s.r.o.

Testovací metoda. Testovací metoda. public class SimpleTest {

Principy objektově orientovaného programování

Soubor jako posloupnost bytů

Distribuované systémy a výpočty

Katedra měřicí a řídicí techniky, VŠB - Technická univerzita v Ostravě, tř. 17. listopadu, Ostrava-Poruba, Česká republika

9. přednáška - třídy, objekty

7.5 Diagram tříd pokročilé techniky

Paměť počítače. alg2 1

Softwarové komponenty a Internet

specifikuje vytvářené objekty pomocí prototypické instance nový objekt vytváří kopírováním prototypu

Transkript:

základní seznámení s frameworkem Lukáš Koĺısko lkolisko@gmail.com 26.11.2007

Cíle prezentace Cíle prezentace To DI, or not to DI Varianty řešení DI Výhody a nevýhody Cílem prezentace je ukázat, že... v jednoduchosti je síla Java aplikace může fungovat bez XML dependency injection není žádná magie

Cíle prezentace Cíle prezentace To DI, or not to DI Varianty řešení DI Výhody a nevýhody Cílem prezentace je ukázat, že... v jednoduchosti je síla Java aplikace může fungovat bez XML dependency injection není žádná magie... mezi tím Vás mimochodem seznámit s

Cíle prezentace Cíle prezentace To DI, or not to DI Varianty řešení DI Výhody a nevýhody Cílem prezentace je ukázat, že... v jednoduchosti je síla Java aplikace může fungovat bez XML dependency injection není žádná magie... mezi tím Vás mimochodem seznámit s a pokud možno neuspat...

Cíle prezentace To DI, or not to DI Varianty řešení DI Výhody a nevýhody To DI, or not to DI...

Hollywoodský princip Don t call us, We ll call you Cíle prezentace To DI, or not to DI Varianty řešení DI Výhody a nevýhody Základní princip Objekty definují svoje závislosti pouze na základě argumentů konstruktorů, statických factory metod nebo setterů, které jsou volány na nově vytvořené instanci.

Hollywoodský princip Don t call us, We ll call you Cíle prezentace To DI, or not to DI Varianty řešení DI Výhody a nevýhody Základní princip Objekty definují svoje závislosti pouze na základě argumentů konstruktorů, statických factory metod nebo setterů, které jsou volány na nově vytvořené instanci. DI kontejner DI kontejner vytváří instance objektů a zajišt uje injekci deklarovaných závislostí.

Varianty řešení DI Cíle prezentace To DI, or not to DI Varianty řešení DI Výhody a nevýhody

Varianty řešení DI Cíle prezentace To DI, or not to DI Varianty řešení DI Výhody a nevýhody Field injection Závislosti jsou kontejnerem injektovány přímo do instančních nebo statických proměnných třídy.

Varianty řešení DI Cíle prezentace To DI, or not to DI Varianty řešení DI Výhody a nevýhody Field injection Závislosti jsou kontejnerem injektovány přímo do instančních nebo statických proměnných třídy. Setter injection DI kontejner vytvoří novou instanci pomocí bezparametrického konstruktoru a závislosti jsou nastaveny pomocí setterů.

Varianty řešení DI Cíle prezentace To DI, or not to DI Varianty řešení DI Výhody a nevýhody Field injection Závislosti jsou kontejnerem injektovány přímo do instančních nebo statických proměnných třídy. Setter injection DI kontejner vytvoří novou instanci pomocí bezparametrického konstruktoru a závislosti jsou nastaveny pomocí setterů. Constructor injection DI kontejner vloží závislosti jako argumenty konstruktoru nebo parametry statické factory metody.

Výhody a nevýhody Cíle prezentace To DI, or not to DI Varianty řešení DI Výhody a nevýhody Field injection kompaktní syntaxe (výhoda pro slajdy) nelze navázat další akci testovatelnost Setter injection není field injection testovatelnost Constructor injection možnost použití final jistota plné inicializace přehlednost volitelná injekce nelze použít v případě instancí vznikajících mimo DI kontejner nadtřída musí znát všechny závislosti podtřídy méně pohodlné testování

Guice s Vodkou Základní anotace Definice modulu Získání instance z kontejneru [juice] Lightweight dependency injection framework pro Javu 5+ Kdo? Bob Lee [crazyboblee] - software enginner, Google, Inc. Kevin Bourrillion [kevinb9n] - senior sofware engineer, Google, Inc. Proč? Projekt vznikl v rámci vývoje systému AdWords ve společnosti Google. Cílem bylo dosažení vyšší modularity kódu pro zjednodušení testovatelnosti celého systému. Kde? http://code.google.com/p/google-guice Licence? Apache License, Version 2.0

Džusík s Vodkou... Guice s Vodkou Základní anotace Definice modulu Získání instance z kontejneru Služba public interface LahevVodky { public void otevri(); public Vodka nacti() throws Exception; public void zavri(); Klient public class Programtor { public void dejsi(){... public boolean vesely(){...

Džusík s Vodkou... Guice s Vodkou Základní anotace Definice modulu Získání instance z kontejneru Služba public interface LahevVodky { public void otevri(); public Vodka nacti() throws Exception; public void zavri(); Klient public class Programtor { public void dejsi(){... public boolean vesely(){...

Factory pro LahevVodky Guice s Vodkou Základní anotace Definice modulu Získání instance z kontejneru public class Lihovar { private static LahevVodky instance; private Lihovar(){ public static LahevVodky getinstance(){ return instace; public static void setinstance(lahevvodky other){ instance=other;

Klient pro factory Guice s Vodkou Základní anotace Definice modulu Získání instance z kontejneru public class Programator { public void dejsi(){ Vodka vodka=lihovar.getinstance(); vodka.otevri();...

Guice s Vodkou Základní anotace Definice modulu Získání instance z kontejneru Vložení závislosti @Inject - Constructor based public class Programator { private final LahevVodky lahev; @Inject public Programator(LahevVodky lahev){ this.lahev=lahev; public void dejsi(){ vodka.otevri(); vnitrnistav=lahev.nacti();...

Guice s Vodkou Základní anotace Definice modulu Získání instance z kontejneru Vložení závislosti @Inject - Setter based public class Programator { private LahevVodky lahev; public Programator(){ @Inject public setlahev(lahevvodky lahev){ this.lahev=lahev; public void dejsi(){ vodka.otevri();...

Definice modulu Guice s Vodkou Základní anotace Definice modulu Získání instance z kontejneru Modul programovým způsobem popisuje vazby mezi jednotlivými objekty a vlastnosti těchto vazeb modul:aplikace je ve vztahu M:N moduly mohou vytvářet strom public class AppModule implements Module { public void configure(binder binder){ binder.bind(lahevvodky.class).to(finlandia.class)

Definice modulu Guice s Vodkou Základní anotace Definice modulu Získání instance z kontejneru Modul programovým způsobem popisuje vazby mezi jednotlivými objekty a vlastnosti těchto vazeb modul:aplikace je ve vztahu M:N moduly mohou vytvářet strom public class AppModule implements Module { public void configure(binder binder){ binder.bind(lahevvodky.class).to(finlandia.class)

Definice modulu Guice s Vodkou Základní anotace Definice modulu Získání instance z kontejneru Modul programovým způsobem popisuje vazby mezi jednotlivými objekty a vlastnosti těchto vazeb modul:aplikace je ve vztahu M:N moduly mohou vytvářet strom public class AppModule implements Module { public void configure(binder binder){ binder.bind(lahevvodky.class).to(finlandia.class)

Definice modulu Guice s Vodkou Základní anotace Definice modulu Získání instance z kontejneru Modul programovým způsobem popisuje vazby mezi jednotlivými objekty a vlastnosti těchto vazeb modul:aplikace je ve vztahu M:N moduly mohou vytvářet strom public class AppModule implements Module { public void configure(binder binder){ binder.bind(lahevvodky.class).to(finlandia.class)

Získání instance z kontejneru Guice s Vodkou Základní anotace Definice modulu Získání instance z kontejneru public class Aplikace { public static void main(string[] args){ Injector injector= Guice.createInjector(AppModule.class); Programator programator= injector.getinstance(programator.class);...

Získání instance z kontejneru Guice s Vodkou Základní anotace Definice modulu Získání instance z kontejneru public class Aplikace { public static void main(string[] args){ Injector injector= Guice.createInjector(AppModule.class); Programator programator= injector.getinstance(programator.class);...

Získání instance z kontejneru Guice s Vodkou Základní anotace Definice modulu Získání instance z kontejneru public class Aplikace { public static void main(string[] args){ Injector injector= Guice.createInjector(AppModule.class); Programator programator= injector.getinstance(programator.class);...

Anotace vazeb Providery Inicializace vazby Konstanty Explicitní definice závislosti @ImplementedBy Anotace @ImplementedBy explicitně definuje, který typ bude použit jako implementace daného rozhraní v případě injekce závislosti na místo interface. @ImplementedBy(Finlandia.class) public interface LahevVodky {...

Implicitní binding Anotace vazeb Providery Inicializace vazby Konstanty Pokud není specifikována explicitní vazba, pak Guice hledá implementaci vazby za běhu (JIT binding). provider převedená konstanta @ImplementedBy @ProvidedBy třída class RuskyProgramator{ @Inject public RuskyProgramator(Putinka lahev){...

Implicitní binding Anotace vazeb Providery Inicializace vazby Konstanty Pokud není specifikována explicitní vazba, pak Guice hledá implementaci vazby za běhu (JIT binding). provider převedená konstanta @ImplementedBy @ProvidedBy třída class RuskyProgramator{ @Inject public RuskyProgramator(Putinka lahev){...

Anotace vazeb Providery Inicializace vazby Konstanty Rozhraní služby má více různých implementací. Různí klienti potřebují specifické implementace, ale nechceme zavést přímou vazbu na danou implementaci.

Anotace vazeb - konfigurace Anotace vazeb Providery Inicializace vazby Konstanty Definice anotace vazby: @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.PARAMETER) @BindingAnnotation public @interface Ruska { Konfigurace s použitím anotace:... bind(lahevvodky.class).annotatedwith(ruska.class).to(putinka.class) bind(lahevvodky.class).annotatedwith(finska.class).to(finlandia.class)...

Použití anotace vazby Anotace vazeb Providery Inicializace vazby Konstanty @Inject @Ruska LahevVodky lahev; nebo @Inject void setlahev(@finska LahevVodky lahev){...

Anotace vazeb Providery Inicializace vazby Konstanty Parametrizovatelné pojmenované vazby - @Named Pokud nechceme z nějakého důvodu definovat novou anotaci, pak lze použít parametrizovatelnou annotaci @Named. import static com.google.inject.name.names.*; bind(lahevvodky.class).annotatedwith(named("ruska")).to(putinka.class) @Inject @Named("Ruska") LahevVodky lahev; V Guice lze definovat vlastní parametrizovatelné vazby.

Anotace vazeb Providery Inicializace vazby Konstanty Potřebujeme mít možnost získat libovolný počet instancí daného typu. Potřebujeme vytvářet objekty, které mají závislosti, ale nelze je anotovat. Potřebujeme lazy inicializaci instancí. Typ injektované instance závisí na nějaké podmínce známé až během výpočtu. lahev=(víkend)?new Putinka():new Finlandia();

Anotace vazeb Providery Inicializace vazby Konstanty Potřebujeme mít možnost získat libovolný počet instancí daného typu. Potřebujeme vytvářet objekty, které mají závislosti, ale nelze je anotovat. Potřebujeme lazy inicializaci instancí. Typ injektované instance závisí na nějaké podmínce známé až během výpočtu. lahev=(víkend)?new Putinka():new Finlandia();

Anotace vazeb Providery Inicializace vazby Konstanty Potřebujeme mít možnost získat libovolný počet instancí daného typu. Potřebujeme vytvářet objekty, které mají závislosti, ale nelze je anotovat. Potřebujeme lazy inicializaci instancí. Typ injektované instance závisí na nějaké podmínce známé až během výpočtu. lahev=(víkend)?new Putinka():new Finlandia();

Anotace vazeb Providery Inicializace vazby Konstanty Potřebujeme mít možnost získat libovolný počet instancí daného typu. Potřebujeme vytvářet objekty, které mají závislosti, ale nelze je anotovat. Potřebujeme lazy inicializaci instancí. Typ injektované instance závisí na nějaké podmínce známé až během výpočtu. lahev=(víkend)?new Putinka():new Finlandia();

Anotace vazeb Providery Inicializace vazby Konstanty Potřebujeme mít možnost získat libovolný počet instancí daného typu. Potřebujeme vytvářet objekty, které mají závislosti, ale nelze je anotovat. Potřebujeme lazy inicializaci instancí. Typ injektované instance závisí na nějaké podmínce známé až během výpočtu. lahev=(víkend)?new Putinka():new Finlandia();

Providery - definice Anotace vazeb Providery Inicializace vazby Konstanty jeden z hlavních konceptů Guice slouží jako vnitřní factory na objekty závislosti provideru mohou být injektovány providery lze skládat (např. ) class Lihovar implements Provider<LahevVodky> { @Inject Lihovar(Cukrovar cukrovar){... LahevVodky get(){... provider metody - @Provides, ProviderMethods.from(Object providers)

Providery - definice Anotace vazeb Providery Inicializace vazby Konstanty jeden z hlavních konceptů Guice slouží jako vnitřní factory na objekty závislosti provideru mohou být injektovány providery lze skládat (např. ) class Lihovar implements Provider<LahevVodky> { @Inject Lihovar(Cukrovar cukrovar){... LahevVodky get(){... provider metody - @Provides, ProviderMethods.from(Object providers)

Providery - definice Anotace vazeb Providery Inicializace vazby Konstanty jeden z hlavních konceptů Guice slouží jako vnitřní factory na objekty závislosti provideru mohou být injektovány providery lze skládat (např. ) class Lihovar implements Provider<LahevVodky> { @Inject Lihovar(Cukrovar cukrovar){... LahevVodky get(){... provider metody - @Provides, ProviderMethods.from(Object providers)

Providery - definice Anotace vazeb Providery Inicializace vazby Konstanty jeden z hlavních konceptů Guice slouží jako vnitřní factory na objekty závislosti provideru mohou být injektovány providery lze skládat (např. ) class Lihovar implements Provider<LahevVodky> { @Inject Lihovar(Cukrovar cukrovar){... LahevVodky get(){... provider metody - @Provides, ProviderMethods.from(Object providers)

Providery - konfigurace Anotace vazeb Providery Inicializace vazby Konstanty Binderem bind(lahevvodky.class).toprovider(lihovar.class); Anotací @ProvidedBy @ProvidedBy(Lihovar.class) interface LahevVodky {... Modulem Object obj=new ObjectSProviderMetodami(); binder.install(providermethods.from(obj))

Providery - konfigurace Anotace vazeb Providery Inicializace vazby Konstanty Binderem bind(lahevvodky.class).toprovider(lihovar.class); Anotací @ProvidedBy @ProvidedBy(Lihovar.class) interface LahevVodky {... Modulem Object obj=new ObjectSProviderMetodami(); binder.install(providermethods.from(obj))

Providery - konfigurace Anotace vazeb Providery Inicializace vazby Konstanty Binderem bind(lahevvodky.class).toprovider(lihovar.class); Anotací @ProvidedBy @ProvidedBy(Lihovar.class) interface LahevVodky {... Modulem Object obj=new ObjectSProviderMetodami(); binder.install(providermethods.from(obj))

Providery - konfigurace Anotace vazeb Providery Inicializace vazby Konstanty Binderem bind(lahevvodky.class).toprovider(lihovar.class); Anotací @ProvidedBy @ProvidedBy(Lihovar.class) interface LahevVodky {... Modulem Object obj=new ObjectSProviderMetodami(); binder.install(providermethods.from(obj))

Providery - více instancí Anotace vazeb Providery Inicializace vazby Konstanty @Inject Provider<LahevVodky> lihovar;... LahevVodky jedna=lihovar.get(); LahevVodky druha=lihovar.get();... Pokud neposkytneme vlastní provider, Guice vytvoří provider automaticky.

Providery - více instancí Anotace vazeb Providery Inicializace vazby Konstanty @Inject Provider<LahevVodky> lihovar;... LahevVodky jedna=lihovar.get(); LahevVodky druha=lihovar.get();... Pokud neposkytneme vlastní provider, Guice vytvoří provider automaticky.

Providery - více instancí Anotace vazeb Providery Inicializace vazby Konstanty @Inject Provider<LahevVodky> lihovar;... LahevVodky jedna=lihovar.get(); LahevVodky druha=lihovar.get();... Pokud neposkytneme vlastní provider, Guice vytvoří provider automaticky.

Providery - různé instance Anotace vazeb Providery Inicializace vazby Konstanty class Vecerka implements Provider<Vodka> { @Inject @Ruska Provider<LahevVodka> ruske; @Inject @Finska Provider<LahevVodka> finske; public LahevVodky get(){ return (vánoce)?ruske.get():finske.get();

Providery - různé instance Anotace vazeb Providery Inicializace vazby Konstanty class Vecerka implements Provider<Vodka> { @Inject @Ruska Provider<LahevVodka> ruske; @Inject @Finska Provider<LahevVodka> finske; public LahevVodky get(){ return (vánoce)?ruske.get():finske.get();

Providery - různé instance Anotace vazeb Providery Inicializace vazby Konstanty class Vecerka implements Provider<Vodka> { @Inject @Ruska Provider<LahevVodka> ruske; @Inject @Finska Provider<LahevVodka> finske; public LahevVodky get(){ return (vánoce)?ruske.get():finske.get();

Providery - různé instance Anotace vazeb Providery Inicializace vazby Konstanty class Vecerka implements Provider<Vodka> { @Inject @Ruska Provider<LahevVodka> ruske; @Inject @Finska Provider<LahevVodka> finske; public LahevVodky get(){ return (vánoce)?ruske.get():finske.get();

Inicializace objektu při startu Anotace vazeb Providery Inicializace vazby Konstanty V implicitním případě jsou objekty vytvářeny až v okamžiku, kdy jsou vyžadovány jiným objektem v rámci definované závislosti. Toto chování lze změnit následujícím způsobem: bind(startuptask.class).aseagersingleton();

Konstanty Anotace vazeb Providery Inicializace vazby Konstanty Guice umožňuje injektovat konstatní hodnoty pro následující typy: Primitivní typy Objektové wrappery pro primitivní typy Řetězce Výčty Třídy

Definice a injekce konstanty Anotace vazeb Providery Inicializace vazby Konstanty Kĺıč konstanty anotace - např. @AlcoholVol Konfigurace konstaty Určení typu z argumentu vazby bindconstant().annotatedwith(alcoholvol.class).to(38); Explicitní určení typu konstanty bind(int.class).annotatedwith(alcoholvol.class).toinstance(38); Implicitní konverze podle typu v místě injekce bindcontstant().annotatedwith(alcoholvol.class).to("38"); Použití konstanty @Inject @AlcoholVol int vol;

Definice a injekce konstanty Anotace vazeb Providery Inicializace vazby Konstanty Kĺıč konstanty anotace - např. @AlcoholVol Konfigurace konstaty Určení typu z argumentu vazby bindconstant().annotatedwith(alcoholvol.class).to(38); Explicitní určení typu konstanty bind(int.class).annotatedwith(alcoholvol.class).toinstance(38); Implicitní konverze podle typu v místě injekce bindcontstant().annotatedwith(alcoholvol.class).to("38"); Použití konstanty @Inject @AlcoholVol int vol;

Definice a injekce konstanty Anotace vazeb Providery Inicializace vazby Konstanty Kĺıč konstanty anotace - např. @AlcoholVol Konfigurace konstaty Určení typu z argumentu vazby bindconstant().annotatedwith(alcoholvol.class).to(38); Explicitní určení typu konstanty bind(int.class).annotatedwith(alcoholvol.class).toinstance(38); Implicitní konverze podle typu v místě injekce bindcontstant().annotatedwith(alcoholvol.class).to("38"); Použití konstanty @Inject @AlcoholVol int vol;

Definice a injekce konstanty Anotace vazeb Providery Inicializace vazby Konstanty Kĺıč konstanty anotace - např. @AlcoholVol Konfigurace konstaty Určení typu z argumentu vazby bindconstant().annotatedwith(alcoholvol.class).to(38); Explicitní určení typu konstanty bind(int.class).annotatedwith(alcoholvol.class).toinstance(38); Implicitní konverze podle typu v místě injekce bindcontstant().annotatedwith(alcoholvol.class).to("38"); Použití konstanty @Inject @AlcoholVol int vol;

Definice a injekce konstanty Anotace vazeb Providery Inicializace vazby Konstanty Kĺıč konstanty anotace - např. @AlcoholVol Konfigurace konstaty Určení typu z argumentu vazby bindconstant().annotatedwith(alcoholvol.class).to(38); Explicitní určení typu konstanty bind(int.class).annotatedwith(alcoholvol.class).toinstance(38); Implicitní konverze podle typu v místě injekce bindcontstant().annotatedwith(alcoholvol.class).to("38"); Použití konstanty @Inject @AlcoholVol int vol;

Scope v Guice Scope v Guice Podporované scopes Konfigurace scope Uživatelsky definovaný scope Scope Scope specifikuje způsob práce s vytvořenými instancemi z hlediska jejich životního cyklu v Guice. Implicitní scope Implicitně nemá vazba definovaný žádný scope.pro každou vazbu je vytvořena nová instance. vytvoř injektuj zapomeň

Podporované scopes Scope v Guice Podporované scopes Konfigurace scope Uživatelsky definovaný scope No scope - nová instance pro každou injekci (prototype) Singleton jediná instance @Singleton,.SINGLETON Request instance v attributes requestu @RequestScoped, Servlet.REQUEST Session instance v session @SessionScoped, Servlet.SESSION Request, Session scope - GuiceFilter, GuiceServletContextListener, InjectedHttpServlet

Podporované scopes Scope v Guice Podporované scopes Konfigurace scope Uživatelsky definovaný scope No scope - nová instance pro každou injekci (prototype) Singleton jediná instance @Singleton,.SINGLETON Request instance v attributes requestu @RequestScoped, Servlet.REQUEST Session instance v session @SessionScoped, Servlet.SESSION Request, Session scope - GuiceFilter, GuiceServletContextListener, InjectedHttpServlet

Podporované scopes Scope v Guice Podporované scopes Konfigurace scope Uživatelsky definovaný scope No scope - nová instance pro každou injekci (prototype) Singleton jediná instance @Singleton,.SINGLETON Request instance v attributes requestu @RequestScoped, Servlet.REQUEST Session instance v session @SessionScoped, Servlet.SESSION Request, Session scope - GuiceFilter, GuiceServletContextListener, InjectedHttpServlet

Podporované scopes Scope v Guice Podporované scopes Konfigurace scope Uživatelsky definovaný scope No scope - nová instance pro každou injekci (prototype) Singleton jediná instance @Singleton,.SINGLETON Request instance v attributes requestu @RequestScoped, Servlet.REQUEST Session instance v session @SessionScoped, Servlet.SESSION Request, Session scope - GuiceFilter, GuiceServletContextListener, InjectedHttpServlet

Podporované scopes Scope v Guice Podporované scopes Konfigurace scope Uživatelsky definovaný scope No scope - nová instance pro každou injekci (prototype) Singleton jediná instance @Singleton,.SINGLETON Request instance v attributes requestu @RequestScoped, Servlet.REQUEST Session instance v session @SessionScoped, Servlet.SESSION Request, Session scope - GuiceFilter, GuiceServletContextListener, InjectedHttpServlet

Konfigurace scope Scope v Guice Podporované scopes Konfigurace scope Uživatelsky definovaný scope Konfigurace pomocí modulu binder.bind(lahevvodky.class).to(finlandia.class).in(.singleton); Konfigurace pomocí anotace @Singleton public class Finlandia implements LahevVodky { public void otevri(){...

Uživatelsky definované scopes Scope v Guice Podporované scopes Konfigurace scope Uživatelsky definovaný scope Definice anotace scope @Retention(RUNTIME) @Target({TYPE) @ScopeAnnotation pulic @interface VodkaScoped { Implementace scope static final Scope VODKA_PARTY_SCOPE = new Scope { public <T> Provider<T> scope(key<t> key, final Provider<T> creator){... Konfigurace scope binder.bindscope(vodkascoped.class, VODKA_PARTY_SCOPE);

Uživatelsky definované scopes Scope v Guice Podporované scopes Konfigurace scope Uživatelsky definovaný scope Definice anotace scope @Retention(RUNTIME) @Target({TYPE) @ScopeAnnotation pulic @interface VodkaScoped { Implementace scope static final Scope VODKA_PARTY_SCOPE = new Scope { public <T> Provider<T> scope(key<t> key, final Provider<T> creator){... Konfigurace scope binder.bindscope(vodkascoped.class, VODKA_PARTY_SCOPE);

Uživatelsky definované scopes Scope v Guice Podporované scopes Konfigurace scope Uživatelsky definovaný scope Definice anotace scope @Retention(RUNTIME) @Target({TYPE) @ScopeAnnotation pulic @interface VodkaScoped { Implementace scope static final Scope VODKA_PARTY_SCOPE = new Scope { public <T> Provider<T> scope(key<t> key, final Provider<T> creator){... Konfigurace scope binder.bindscope(vodkascoped.class, VODKA_PARTY_SCOPE);

Uživatelsky definované scopes Scope v Guice Podporované scopes Konfigurace scope Uživatelsky definovaný scope Definice anotace scope @Retention(RUNTIME) @Target({TYPE) @ScopeAnnotation pulic @interface VodkaScoped { Implementace scope static final Scope VODKA_PARTY_SCOPE = new Scope { public <T> Provider<T> scope(key<t> key, final Provider<T> creator){... Konfigurace scope binder.bindscope(vodkascoped.class, VODKA_PARTY_SCOPE);

Development stages Development stages AOP interceptory Statická injekce závislostí Integrace s jinými frameworky Development stages Umožňují měnit chování Guice na základě prostředí, ve kterém je aplikace spouštěna. DEVELOPMENT (implicitní) Rychlý start aplikace + detailnějšími informace o vzniklých chybách PRODUCTION zachycení maxima chyb konfigurace při startu aplikace. TOOL Stage pro IDE Vytvoření metadat bindingů, nevytváří se žádné instance

Development stages Development stages AOP interceptory Statická injekce závislostí Integrace s jinými frameworky Development stages Umožňují měnit chování Guice na základě prostředí, ve kterém je aplikace spouštěna. DEVELOPMENT (implicitní) Rychlý start aplikace + detailnějšími informace o vzniklých chybách PRODUCTION zachycení maxima chyb konfigurace při startu aplikace. TOOL Stage pro IDE Vytvoření metadat bindingů, nevytváří se žádné instance

Development stages Development stages AOP interceptory Statická injekce závislostí Integrace s jinými frameworky Development stages Umožňují měnit chování Guice na základě prostředí, ve kterém je aplikace spouštěna. DEVELOPMENT (implicitní) Rychlý start aplikace + detailnějšími informace o vzniklých chybách PRODUCTION zachycení maxima chyb konfigurace při startu aplikace. TOOL Stage pro IDE Vytvoření metadat bindingů, nevytváří se žádné instance

Development stages Development stages AOP interceptory Statická injekce závislostí Integrace s jinými frameworky Development stages Umožňují měnit chování Guice na základě prostředí, ve kterém je aplikace spouštěna. DEVELOPMENT (implicitní) Rychlý start aplikace + detailnějšími informace o vzniklých chybách PRODUCTION zachycení maxima chyb konfigurace při startu aplikace. TOOL Stage pro IDE Vytvoření metadat bindingů, nevytváří se žádné instance

AOP interceptory Development stages AOP interceptory Statická injekce závislostí Integrace s jinými frameworky Guice podporuje method interceptory používající AOP Alliance API method interceptory se registrují v modulech definice pointcuts implementacemi Matcher API (předpřipravené typ, annotace, AND, OR, NOT) přímo v jádře frameworku binder.bindinterceptor( any(), annotatedwith(transactional.class), new TransactionInterceptor() );

Development stages AOP interceptory Statická injekce závislostí Integrace s jinými frameworky Při replikaci je objekt serializován a přesunut mezi dvěma uzly. Jak zajistíme získání referencí na služby na cílovém uzlu?

Statická injekce závislostí Development stages AOP interceptory Statická injekce závislostí Integrace s jinými frameworky Klient @SessionScoped class Client { @Inject static Service service;... Konfigurace public void configure(binder binder){... binder.requeststaticinjection(client.class);... Statickou injekci je třeba explicitně vyžádat

Integrace s jinými frameworky (1) přímo v Guice Development stages AOP interceptory Statická injekce závislostí Integrace s jinými frameworky JNDI provider pro lookup v JNDI Spring provider pro lookup Spring beans na základě jména binding všech beans ze Spring factory jako @Named(... ) použití interceptorů ze Springu JMX registrace všech beans v injectoru jako MBeans serveru Struts2 implementace object factory

Integrace s jinými frameworky (2) 3rd party moduly Development stages AOP interceptory Statická injekce závislostí Integrace s jinými frameworky JPA (Hibernate) Warp Persist, Dynamic Finders http://www.wideplay.com/guicewebextensions2 OSGi Peabery - patch Guice - podpora injekce OSGi služeb http://code.google.com/p/peaberry DWR DWR-Guice integration http://dev.priorartisans.com/tim/dwr-guice

Shrnutí hlavních vlastností GUICE Shruntí hlavních vlastností GUICE Použité zdroje informací Dotazy Rozloučení Využití možností Javy 5+ - anotace, generika kompaktnější zápis metadat statická kontrola refaktoring žádné XML Typová konverze pro konstanty AOP interceptory AOP Alliance API Matcher API Development stages Integrace s jinými frameworky

Použíté zdroje informací Shruntí hlavních vlastností GUICE Použité zdroje informací Dotazy Rozloučení - domovská stránka projektu http://code.google.com/p/google-guice Bob Lee and Kevin Bourrillion - interview a prezentace Google Developer Day, JavaOne, Google Tech Talks, TheServerSide The Spring Framework - Reference Documentation http://static.springframework.org/spring/docs/2.5.x/reference

Shruntí hlavních vlastností GUICE Použité zdroje informací Dotazy Rozloučení Zeptejte se...

Shruntí hlavních vlastností GUICE Použité zdroje informací Dotazy Rozloučení Děkuji Vám za Vaši pozornost... Lukáš Koĺısko lkolisko@gmail.com