«

»

Mar 23

Tutorial: Google Guice – Injeção de dependencias by Google

Um pouco antes de ser anunciada a colaboração do google para o Hibernate, o Google lançou como open source, o Guice, um framework de injeção de dependencias que eles utilizavam internamente …

Mesmo ja fazendo algum tempo que o Guice foi lançado, eu ainda não tinha tirado algum tempo para testar o framework, então resolvi fazer isto hoje, e estou postando aqui as minhas primeiras impressões sobre ele em formato de mini tutorial …

O Guice é um framework de injeção de dependencias apenas, diferente do spring, que tem como base a injeção de dependencias, mas os outros recursos é que fazem realmente valer a pena a utilização dele …

E novamente, diferente do spring, Guice não utiliza um arquivo de configurações XML, toda a configuração do Guiceé feita em Java, ou via anotações, o que eu acho que na maioria das situaçõesé vantagem, mas tem aqueles casos em que é interessante externalizar algumas configurações (é isto que eu acho perfeito na combinação Spring Framework + Spring-Annotation), mas não vamos começar a botar efeito no framework antes de testar ele …

O Guice na versão atual (1.0) tem integração com:

  • Spring-Framework – que permite que beans definidos no spring sejam injetados nos beans configurados pelo Guice
  • Struts 2 – que permite que beans configurados pelo Guice sejam utilizados no Struts 2
  • Servlet API – é um filtro que permite que quando estiver sendo utilizado em ambiente web, o Guice possa gerenciar beans utilizando os escopos de request e session
  • JNDI – que permite injetar (Fazer LookUp) de beans registrados via JNDI
  • JMX – permite gerenciar os beans criados pelo Guice, via JMX

Achei até bem legal a abordagem deles, e o empacotamento também, cada uma das integrações do framework vem em um jar separado, permitindo que o deploy da aplicação inclua apenas o que é necessário para aquela aplicação …

Uma coisa que não esta escrita na documentação do projeto, mas que é bem fácil até de ser feita, é utilizar o Guice, pelo menos para situações mais simples, sem extender nenhuma classe Abstrata (o que foi a maior reclamação do pessoal do Guj sobre o Guice), vejam só o exemplo a baixo, eu utilizei as mesmas classes do manual do Guice, com pequenas modificações …

Este é o “Lançador” da minha aplicação de testes …

package br.com.urubatan.guice.test;

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;

public class Main
{
public static void main(String[] args)
{
Injector inj = Guice.createInjector(new Module[0]);
Client c = inj.getInstance(Client.class);
c.go();
}

}

E estas as classes que eu copiei do manual do Guice …

package br.com.urubatan.guice.test;

import com.google.inject.Inject;

public class Client
{

private final Service service;

@Inject
public Client(Service service)
{
this.service = service;
}

public void go()
{
service.go();
}
}
package br.com.urubatan.guice.test;

import com.google.inject.ImplementedBy;

@ImplementedBy(ServiceImpl.class)
public interface Service
{
void go();
}
package br.com.urubatan.guice.test;

import com.google.inject.ImplementedBy;

@ImplementedBy(ServiceImpl.class)
public interface Service
{
void go();
}

Sim, eu concordo que é muito código para escrever um “Hello World”, mas vamos combinar, o forte do java não é o Hello World :D

Lógico que se precisarmos de situações mais complexas, ai precisamos implementar um modulo do Guice, mas mesmo assim, não vi muita vantagem em extender aquela classe abstrata que é apenas um “Delegate” para o Binder, para remover 4 letras de código, vejamos um exemplo um pouco mais complexo, utilizando alguns recursos mais interessantes do Guice, por exemplo acessando um data source via JNDI, mas para isto vamos precisar criar um modulo, mas sem extender AbstractModule, que eu também achei bem feio …