<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog Espeo Software &#187; guice</title>
	<atom:link href="http://blog.espeo.pl/tag/guice/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.espeo.pl</link>
	<description>O technologii i biznesie naszym zdaniem</description>
	<lastBuildDate>Mon, 05 Jul 2010 12:16:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Google GIN, czyli dependency injection w GWT</title>
		<link>http://blog.espeo.pl/2009/09/04/google-gin-czyli-dependency-injection-w-gwt/</link>
		<comments>http://blog.espeo.pl/2009/09/04/google-gin-czyli-dependency-injection-w-gwt/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 15:05:48 +0000</pubDate>
		<dc:creator>Michał Kalinowski</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[gin]]></category>
		<category><![CDATA[guice]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=160</guid>
		<description><![CDATA[Wstęp
Google GIN (GWT INjection) to stosunkowo młody projekt Google, wprowadzający do Google Web Toolkit możliwość wstrzykiwania zależności (ang. dependency injection). Oparty jest na Google Guice (o którym pisałem kilka tygodni temu) i zapewnia pewien podzbiór funkcjonalności tej biblioteki.  Po co więc GIN? Potrzeba wynika wprost ze specyfiki aplikacji tworzonych w GWT, która uniemożliwia zastosowanie &#8220;typowego&#8221; [...]]]></description>
			<content:encoded><![CDATA[<h2>Wstęp</h2>
<p><a href="http://code.google.com/p/google-gin/" target="_blank">Google GIN (GWT INjection)</a> to stosunkowo młody projekt Google, wprowadzający do <a href="http://code.google.com/webtoolkit/" target="_blank">Google Web Toolkit</a> możliwość wstrzykiwania zależności (ang. <em>dependency injection</em>). Oparty jest na <a href="http://code.google.com/p/google-guice/" target="_blank">Google Guice</a> (o którym <a href="http://blog.espeo.pl/2009/08/18/google-guice-dependency-injection-framework/" target="_blank">pisałem kilka tygodni temu</a>) i zapewnia pewien podzbiór funkcjonalności tej biblioteki.  Po co więc GIN? Potrzeba wynika wprost ze specyfiki aplikacji tworzonych w GWT, która uniemożliwia zastosowanie &#8220;typowego&#8221; frameworka do wstrzykiwania zależności. Rozwinę ten temat za chwilę.</p>
<p>Póki co, nie ma możliwości pobrania skompilowanej biblioteki ze strony projektu (tak jak pisałem, jest to jeszcze wczesna faza rozwoju), więc pozostaje <em>check out</em> z publicznego repozytorium i własnoręczna kompilacja:</p>
<pre>
<pre class="brush: bash;">
svn checkout http://google-gin.googlecode.com/svn/trunk/ google-gin-read-only
cd google-gin-read-only
ant dist
</pre>
</pre>
<p>Zbudowanego JARa (<strong>./out/dist/gin.jar</strong>) oczywiście należy dołączyć do swojego projektu.</p>
<h2>Zaczynamy!</h2>
<p>Mamy już dostępne klasy GIN, więc można zaczynać. W regularnym Guice, po skonfigurowaniu zależności w klasie modułu i utworzeniu <strong>Injector</strong>a, obiekty pobiera się mniej więcej tak:</p>
<pre>
<pre class="brush: java;">
RegistrationService registrationService = injector.getInstance(RegistrationService.class);
</pre>
</pre>
<p>W GWT jednak powyższy kod nie zadziała. Żeby być ścisłym: nie zadziała w komponentach po stronie klienta (ang. <em>client-side</em>). Jak wiadomo, aplikacja GWT dzieli się na stronę klienta i stronę serwera. Po stronie serwera nie ma żadnego problemu ze wstrzykiwaniem zależności. Obiekty są instancjonowane w rzeczywistym JRE (najczęściej w kontenerze serwletów) i żyją &#8220;normalnym&#8221; Javowym życiem. Można używać Guice, Spring albo dowolnego innego rozwiązania do wstrzykiwania zależności i będzie działać. Po stronie klienta wygląda to jednak zupełnie inaczej, ponieważ kod Java jest kompilowany do JavaScript, więc JRE nie istnieje (jest jedynie w niewielkim zakresie emulowane przez bibliotekę GWT). Standardowe użycie Guice nie zadziała więc z dwóch powodów:</p>
<ul>
<li>Na poziomie JavaScript nie istnieją klasy.</li>
<li>Guice (podobnie jak większość tego typu rozwiązań) często korzysta z mechanizmu <em>reflection</em> Javy, który nie jest w ogóle emulowany w GWT.</li>
</ul>
<p>GIN stosuje więc inny sposób na zapewnienie wstrzykiwania zależności. Na początek należy zaimportować moduł GIN we własnym module GWT.</p>
<pre>
<pre class="brush: xml;">
&lt;module&gt;
  ...
  &lt;inherits name=&quot;com.google.gwt.inject.Inject&quot; /&gt;
  ...
&lt;/module&gt;
</pre>
</pre>
<p>Teraz funkcjonalność oferowana przez GIN jest dostępna w obrębie strony klienta aplikacji GWT. Dochodzimy jednak ponownie do momentu, gdy &#8220;jakoś&#8221; trzeba w końcu te zależności pobrać. W GIN używa się do tego specjalnej wersji <strong>Injector</strong>a &#8212; <strong>Ginjector</strong>a (który jednak de facto nie jest związany relacją dziedziczenia z tym pierwszym).</p>
<pre>
<pre class="brush: java;">
public interface ApplicationGinjector extends Ginjector {
    ApplicationPresenter getApplicationPresenter();
}
</pre>
</pre>
<p><strong>Ginjector</strong> powinien oferować tylko komponenty potrzebne na etapie inicjalizacji aplikacji. Przy ich pobieraniu zostaną zainicjowane ich zależności, a więc również zależności tych zależności itd. W ten sposób zostanie zbudowany cały graf obiektów, a zależności automatycznie powstrzykiwane. W tym przypadku, komponentem potrzebnym na samym początku działania aplikacji jest <strong>ApplicationPresenter</strong>, który wyświetla ekran startowy. Zależności definiuje się dokładnie tak jak w Guice, czyli za pomocą adnotacji <strong>@Inject</strong>.</p>
<p>Jak wiadomo, <strong>Injector</strong> potrzebuje również modułu, w którym zawarte są informacje na temat komponentów.</p>
<pre>
<pre class="brush: java;">
public class ApplicationClientModule extends AbstractGinModule {
    @Override
    protected void configure() {
        bind(ApplicationPresenter.class);
        // other bindings...
    }
}
</pre>
</pre>
<p>Jak widać, moduł po stronie klienta w GWT dziedziczy z <strong>AbstractGinModule</strong>. Poza tym wszystko wygląda dokładnie jak w Guice. Istotnym niuansem związanym z modułami GIN jest fakt, że w przypadku nie odnalezienia powiązania dla klasy, automatycznie wywoływana jest dla niej metoda <strong>GWT.create()</strong>, przez co niektóre rzeczy (np. asynchroniczne interfejsy usług) będą działać nawet bez odpowiedniej deklaracji w klasie modułu.</p>
<p>Zdefiniowany moduł należy jeszcze skojarzyć z właściwym interfejsem <strong>Ginjector</strong> za pomocą adnotacji <strong>@GinModules</strong>.</p>
<pre>
<pre class="brush: java;">
@GinModules(ApplicationClientModule.class)
public interface ApplicationGinjector extends Ginjector {
    ApplicationPresenter getApplicationPresenter();
}
</pre>
</pre>
<p>W ten sposób, <strong>Ginjector</strong> jest w stanie skonfigurować całą aplikację na podstawie danych zawartych w określonym module. Aby to zrobić, należy go utworzyć za pomocą wywołania <strong>GWT.create()</strong> oraz pobrać początkowe obiekty.</p>
<pre>
<pre class="brush: java;">
public final class Application implements EntryPoint {
    public void onModuleLoad() {
        ApplicationGinjector injector = GWT.create(ApplicationGinjector.class);
        ApplicationPresenter applicationPresenter = injector.getApplicationPresenter();
        applicationPresenter.go(RootPanel.get());
    }
}
</pre>
</pre>
<p>W ten sposób, cała procedura wstrzykiwania zależności ma miejsce już w czasie kompilacji. Użycie GIN nie jest więc związane z żadnym dodatkowym narzutem przetwarzania. (Wyszłoby na to samo, gdybyśmy konfigurowali komponenty ręcznie.)</p>
<h2>Prawie jak Guice</h2>
<p>Z użyciem GIN jest związanych kilka niuansów, o czym wspomniałem już na samym początku. GIN to nie jest mimo wszystko to samo co Guice, tylko dla GWT. Najbardziej istotne różnice w stosunku do Guice to:</p>
<ul>
<li>Zamiast typów <strong>Module</strong> i <strong>AbstractModule</strong> są <strong>GinModule</strong> i <strong>AbstractGinModule</strong>.</li>
<li>Zamiast typu <strong>Injector</strong> jest <strong>Ginjector</strong> z adnotacją <strong>@GinModules</strong>.</li>
<li>Niemożliwe jest użycie powiązania <strong>toInstance()</strong> i prawdopodobnie nigdy nie będzie możliwe (ze względu na to, że GIN działa w czasie kompilacji, a nie wykonania).</li>
<li>Na chwilę obecną nie jest możliwe definiowanie własnych zasięgów.</li>
<li>Nie ma adnotacji <strong>@ImplementedBy</strong> oraz <strong>@ProvidedBy</strong>.</li>
<li>Brak obsługi zależności cyklicznych.</li>
<li>Brak wsparcia dla AOP.</li>
</ul>
<p>Warto jeszcze dodać, że istnieje sposób na współpracę z regularnym Guice za pomocą klasy <strong>GinModuleAdapter</strong>, dzięki której <strong>GinModule</strong> staje się dostępny jako zwykły <strong>Module</strong>. Można więc rozważyć utworzenie wspólnej części zależności w postaci <strong>GinModule</strong>. Ponadto, zrozumienie jak działa strona klienta w GWT na pewno pomoże uniknąć wielu potencjalnych problemów z GIN.</p>
<h2>Podsumowanie</h2>
<p>Jak widać, w GWT również można wygodnie wstrzykiwać zależności i to korzystając z bardzo przyjaznego API znanego z Guice. Mimo, że biblioteka ta jest jeszcze nieco niedojrzała i nie doczekała się nawet wersji 1.0, moim zdaniem warto się nią zainteresować i zastosować we własnych projektach w Google Web Toolkit. Używając jej przez ostatnie kilka miesięcy nie napotkałem żadnych problemów (w szczególności ze stabilnością), a znacząco ułatwiłem sobie pracę, rezygnując z ręcznego wstrzykiwania zależności. Myślę, że Google jeszcze nie raz zaskoczy nas różnymi ciekawymi dodatkami do GWT. Póki co, zapraszam na <a href="http://code.google.com/p/google-gin/" target="_blank">stronę domową projektu</a> oraz zachęcam do własnych eksperymentów z Google GIN.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.espeo.pl/2009/09/04/google-gin-czyli-dependency-injection-w-gwt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Guice, dependency injection framework</title>
		<link>http://blog.espeo.pl/2009/08/18/google-guice-dependency-injection-framework/</link>
		<comments>http://blog.espeo.pl/2009/08/18/google-guice-dependency-injection-framework/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 15:30:46 +0000</pubDate>
		<dc:creator>Michał Kalinowski</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[guice]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://blog.espeo.pl/?p=138</guid>
		<description><![CDATA[Wstęp
Google Guice to framework wspierający wstrzykiwanie zależności (ang. dependency injection) w aplikacjach Java. Można by powiedzieć: kolejny framework wspierający wstrzykiwanie zależności. Faktycznie, trzeba przyznać, że rynek Javowych rozwiązań tego typu jest dość mocno nasycony już od dłuższego czasu i oferuje pełen przekrój złożoności bibliotek, zaczynając od bardzo lekkich, takich jak choćby PicoContainer, a kończąc na [...]]]></description>
			<content:encoded><![CDATA[<h2>Wstęp</h2>
<p><a href="http://code.google.com/p/google-guice/" target="_blank">Google Guice</a> to framework wspierający wstrzykiwanie zależności (ang. <em>dependency injection</em>) w aplikacjach Java. Można by powiedzieć: kolejny framework wspierający wstrzykiwanie zależności. Faktycznie, trzeba przyznać, że rynek Javowych rozwiązań tego typu jest dość mocno nasycony już od dłuższego czasu i oferuje pełen przekrój złożoności bibliotek, zaczynając od bardzo lekkich, takich jak choćby <a href="http://www.picocontainer.org/" target="_blank">PicoContainer</a>, a kończąc na pełnych stosach rozwiązań Java Enterprise ze <a href="http://www.springsource.org/about" target="_blank">Springiem</a> na czele. Czy warto więc zawracać sobie głowę Guice&#8217;m? Moim zdaniem warto, bo zaproponowane przez Google&#8217;a rozwiązanie pokazuje nową jakość w implementacji wstrzykiwania zależności w aplikacjach Java, czyniąc ogromny użytek z typów generycznych oraz adnotacji. Guice jest przy tym lekki, ma proste API i bardzo szybko można się go nauczyć. Dlaczego warto to zrobić? Bo jest dobry. Kolesie z Google&#8217;a go używają. Musi być dobry. Poza tym, wygrał <a href="http://www.joltawards.com/history/winners.html" target="_blank">18th Jolt Award</a> w kategorii <em>Libraries, Frameworks and Components</em>. Musi być dobry.</p>
<h2>Podstawy</h2>
<p>W Guice występują dwie podstawowe konstrukcje opisujące wstrzykiwanie zależności. Pierwszą są moduły, które mówią <em>co należy wstrzyknąć</em>, a drugą jest adnotacja <strong>@Inject</strong>, która mówi <em>gdzie należy wstrzyknąć</em>. Proste. Zobaczmy jak to działa na przykładzie usługi rejestracji użytkowników.</p>
<pre class="brush: java;">
public class RegistrationServiceImpl implements RegistrationService {
    private final PersistanceManager persistanceManager;
    private final MailService mailService;

    @Inject
    public RegistrationServiceImpl(PersistanceManager persistanceManager, MailService mailService) {
        this.persistanceManager = persistanceManager;
        this.mailService = mailService;
    }

    public void register(User user) {
        ...
    }
}
</pre>
<p>Jak widać naszą usługę specyfikuje kontrakt <strong>RegistrationService</strong>. Mamy jego implementację w postaci klasy <strong>RegistrationServiceImpl</strong>, która wymaga do działania usługi trwałości danych (<strong>PersistanceManager</strong>) oraz usługi do wysyłania maili (<strong>MailService</strong>). Chcielibyśmy, aby odpowiednie implementacje tych usług zostały automatycznie wstrzyknięte za pomocą parametrów konstruktora (adnotacja <strong>@Inject</strong>) już na etapie tworzenia usługi rejestracji. Spróbujmy opisać zależności między interfejsami a ich konkretnymi realizacjami za pomocą modułu.</p>
<pre class="brush: java;">
public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(RegistrationService.class).to(RegistrationServiceImpl.class);
        bind(PersistanceManager.class).to(HibernatePersistanceManager.class);
        bind(MailService.class).to(JavaMailService.class);
    }
}
</pre>
<p>Mamy nasz moduł. Jak widać, metoda <strong>configure()</strong> zawiera definicje kolejnych powiązań. Mamy więc usługę rejestracji określoną kontraktem <strong>RegistrationService</strong> z przypisaną naszą implementacją <strong>RegistrationServiceImpl</strong>. Mamy również usługę trwałości danych <strong>PersistanceManager</strong> zaimplementowaną w klasie <strong>HibernatePersistanceManager</strong>, która używa Hibernate&#8217;a do zapewnienia trwałości encji, oraz usługę <strong>MailService</strong> wraz z implementacją <strong>JavaMailService</strong> korzystającą z JavaMail do wysyłania poczty.</p>
<p>OK. Wystarczy już tylko użyć zdefiniowanego zespołu obiektów i przeprowadzić rejestrację użytkownika.</p>
<pre class="brush: java;">
public class UserRegistrationExample {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new MyModule());
        RegistrationService registrationService = injector.getInstance(RegistrationService.class);
        User user = new User(&quot;Michal&quot;, &quot;Kalinowski&quot;);
        registrationService.register(user);
    }
}
</pre>
<p>To wszystko. Działa. &#8220;Prawie&#8221; jak w Springu, tylko zamiast trochę przydługawego pliku XML mamy elegancką implementację interfejsu <strong>Module</strong> w Javie, a zamiast identyfikowania obiektów za pomocą jakichś napisów mamy referencje do rzeczywistych klas. Myślę, że nie muszę wspominać jak ułatwia to refactoring. Jedyne do czego można się &#8220;przyczepić&#8221; to inwazyjność framework&#8217;a (odniesienia do API we własnych klasach), ale coś za coś. Wygoda jest niesamowita. Swoją drogą, pomysł na tyle przypadł do gustu kolesiom od Springa, że sami piszą już coś podobnego; nazywa się to <a href="http://www.springsource.org/javaconfig" target="_blank">Spring JavaConfig</a> i powinno niedługo zostać oficjalnie wydane.</p>
<p>Oczywiście, proste powiązania interfejs &lt;=&gt; klasa i wstrzykiwanie zależności przez konstruktor to nie koniec możliwości Guice.</p>
<h2>Powiązania</h2>
<p>Oprócz prostych powiązań klasy z interfejsem, jest również kilka bardziej zaawansowanych konstrukcji.</p>
<p>Jedną z nich jest powiązanie adnotacją. Wyobraźmy sobie, że <strong>JavaMailService</strong> ma zostać użyty przez 2 różne usługi. Jedna z nich, nasz <strong>RegistrationService</strong>, do rozsyłania poczty powinna używać konta na Gmail&#8217;u, a inna &#8211; konta na Yahoo. Nic prostszego. Potrzebna nam dodatkowa adnotacja.</p>
<pre class="brush: java;">
@BindingAnnotation
@Target( { FIELD, PARAMETER, METHOD })
@Retention(RUNTIME)
public @interface Gmail {
}
</pre>
<p>Modyfikujemy nieznacznie konstruktor naszej usługi rejestracji.</p>
<pre class="brush: java;">
public class RegistrationServiceImpl implements RegistrationService {
    @Inject
    public RegistrationServiceImpl(PersistanceManager persistanceManager, @Gmail MailService mailService) {
        this.persistanceManager = persistanceManager;
        this.mailService = mailService;
    }
    ...
}
</pre>
<p>Oczywiście potrzebne jest również dodatkowe powiązanie w module.</p>
<pre class="brush: java;">
bind(MailService.class).annotatedWith(Gmail.class).to(GmailJavaMailService.class);
</pre>
<p>Widać więc, że w Guice powiązanie jednoznacznie definiuje dopiero para adnotacji oraz typu.</p>
<p>Idźmy dalej. Jest możliwość stworzenia powiązania z konkretną instancją danego typu.</p>
<pre class="brush: java;">
bind(String.class).annotatedWith(JdbcUri.class).toInstance(&quot;jdbc:mysql://localhost/application&quot;);
</pre>
<pre class="brush: java;">
public class HibernatePersistanceManager implements PersistanceManager {
    public HibernatePersistanceManager(@JdbcUri String jdbcConnectionString) {
         ...
    }
    ...
}
</pre>
<p>Cool, huh? Można również zdefiniować w module własną metodę tworzenia obiektu. Używa się do tego adnotacji <strong>@Provides</strong>.</p>
<pre class="brush: java;">
public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        ...
    }

    @Provides
    PersistanceManager providePersistanceManager() {
        HibernatePersistanceManager persistanceManager = new HibernatePersistanceManager(&quot;jdbc:mysql://localhost/application&quot;);
        persistanceManager.initConnectionPool();
        return persistanceManager;
    }
}
</pre>
<p>Robi się bałagan w klasie modułu? Napiszmy zewnętrzne providery dla naszych komponentów.</p>
<pre class="brush: java;">
public class DatabasePersistanceManagerProvider implements Provider&lt;persistanceManager&gt; {
    private final Connection connection;

    @Inject
    public DatabasePersistanceManagerProvider(Connection connection) {
        this.connection = connection;
    }

    public PersistanceManager get() {
        DatabasePersistanceManager persistanceManager = new DatabasePersistanceManager();
        persistanceManager.setConnection(connection);
        return persistanceManager;
    }
}
</pre>
<p>I jeszcze odpowiednie powiązanie.</p>
<pre class="brush: java;">
bind(PersistanceManager.class).toProvider(DatabasePersistanceManagerProvider.class);
</pre>
<p>Można nawet zdefiniować providera bezpośrednio w interfejsie.</p>
<pre class="brush: java;">
@ProvidedBy(DatabasePersistanceManagerProvider.class)
public interface PersistanceManager {
    ...
}
</pre>
<p>Warto zwrócić uwagę, że definicje powiązań w Guice &#8220;czytają się same&#8221;. Jest to ogromna zaleta tej biblioteki. Nie ma tu nawet co tłumaczyć.</p>
<h2>Zasięgi</h2>
<p>Domyślnie Guice dostarcza nową instancję klasy przy każdym zapytaniu do kontenera. Można jednak zażyczyć sobie za pomocą adnotacji <strong>@Singleton</strong>, by istniała dokładnie jedna instancja danego komponentu w obrębie całej aplikacji. W aplikacjach webowych, po dołączeniu odpowiedniego dodatku do deskryptora <strong>web.xml</strong>, można używać również zasięgu sesyjnego (<strong>@SessionScoped</strong>) oraz zasięgu pojedynczego żądania HTTP (<strong>@RequestScoped</strong>). Zasięgi można ustawiać na kilka sposobów. Można np. zrobić to na samej klasie.</p>
<pre class="brush: java;">
@Singleton
public class JavaMailService implements MailService {
    ...
}
</pre>
<p>Nic nie stoi na przeszkodzie, by ustawić zasięg na metodzie tworzącej obiekt w obrębie modułu.</p>
<pre class="brush: java;">
public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        ...
    }

    @Provides @Singleton
    MailService provideMailService() {
        ...
    }
}
</pre>
<p>Oczywiście, zawsze można zrobić to po prostu w definicji powiązania.</p>
<pre class="brush: java;">
bind(MailService.class).to(JavaMailService.class).in(Singleton.class);
</pre>
<h2>Wstrzykiwanie</h2>
<p>W Guice dostępne są 3 standardowe metody wstrzykiwania zależności. Widzieliśmy już wstrzykiwanie przez konstruktor. Można również użyć do tego regularnej metody (niekoniecznie klasycznego settera).</p>
<pre class="brush: java;">
public class RegistrationServiceImpl implements RegistrationService {
    @Inject
    public void provideLogger(Logger logger) {
        ...
    }
    ...
}
</pre>
<p>Można również wstrzykiwać bezpośrednio do pola klasy, ale jest to zdecydowanie niezalecane.</p>
<pre class="brush: java;">
public class RegistrationServiceImpl implements RegistrationService {
    @Inject Logger logger;
    ...
}
</pre>
<p>Można w Guice również wstrzykiwać same providery.</p>
<pre class="brush: java;">
public interface Provider&lt;t&gt; {
  T get();
}
</pre>
<p>Zapewniają one dodatkową elastyczność polegającą na tym, że kontener zwraca instancję komponentu-zależności wraz z każdym wywołaniem metody <strong>get()</strong>, a nie tylko jednorazowo na etapie tworzenia grafu obiektów.</p>
<pre class="brush: java;">
public class DatabasePersistanceManager implements PersistanceManager {
    private final Provider&lt;connection&gt; connectionProvider;

    @Inject
    public DatabasePersistanceManager(Provider&lt;connection&gt; connectionProvider) {
        this.connectionProvider = connectionProvider;
    }

    public void persist(Object entity) {
        Connection connection = connectionProvider.get();
        ... // do something with provided connection
    }
}
</pre>
<p>Jakie to może mieć zastosowanie? Różne, przeróżne. Możemy potrzebować wielu instancji tego samego komponentu. Możemy zechcieć pomieszać komponenty różnych zasięgów (np. wstrzykiwanie danych użytkownika utrzymywanych w sesji HTTP do komponentu z zasięgiem Singleton). Możemy wreszcie użyć późnego ładowania (ang. <em>lazy loading</em>), jeśli konstruowanie komponentu-zależności jest kosztowne, a nie musi być wykonywane za każdym razem.</p>
<h2>Czy to wszystko?</h2>
<p>Oczywiście, omówiono tylko część możliwości Guice, aczkolwiek prawdopodobnie wystarczy to w 90% zastosowań. Widać więc, jak szybko można tę technologię przyswoić. Więcej informacji można odnaleźć w <a href="http://code.google.com/p/google-guice/wiki/Motivation" target="_blank">dokumentacji</a> biblioteki. Znajduje się tam m.in. omówienie wsparcia dla programowania aspektowego oraz opis integracji Guice z rozwiązaniami webowymi. Warto tam zajrzeć.</p>
<h2>Podsumowanie</h2>
<p>Google Guice wydaje się stanowić bardzo ciekawą ofertę jako framework do wstrzykiwania zależności. Jeśli nie potrzebujemy bardzo kompleksowego rozwiązania takiego jak np. Spring, Guice powinien być w zupełności wystarczający. Jest bardzo lekki, prosty i ma niezwykle szybką krzywą uczenia. Dokładne przeczytanie tego posta powinno pozwolić na rozpoczęcie pracy, a w razie problemów zawsze pozostaje dokumentacja. Guice znacznie uprzyjemnia pracę programisty, pozwalając opisywać zależności i szczegóły ich wstrzykiwania za pomocą kodu Java &#8220;ozdobionego&#8221; adnotacjami i typami generycznymi, z zachowaniem jednocześnie deklaratywnego charakteru tego opisu. Jest to niewątpliwie znaczny krok do przodu. Uważam, że w dobrym kierunku.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.espeo.pl/2009/08/18/google-guice-dependency-injection-framework/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
