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
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 …

“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 …”
Que outros recursos você considera tão úteis no Spring, Urubatan?
“como por exemplo a integração dele com o Spring, na verdade, eu não consegui ainda pensar em que situação eu utilizaria dois frameworks de injeção de dependencias ao mesmo tempo,”
Se você já tem uma aplicação rodando com Spring e gostou mais do IoC do Guice, isso pode tornar a migração mais “smooth”.
* Algum de vocês ja utilizou o Guice? Não
* O que acharam da abordagem de injeção de dependencias dele? Achei feio o esquema do Module.
* O que acharam de pequenos tutoriais multi página no blog? Ruim.
* Os posts em mais de uma página atrapalham a leitura? Sim.
Bom, exemplos clássicos do que faz valer a pena udar o spring:
Tem mais algumas coisas legais, mas acho que isto é o que gosto mais …
Eu acho que utilizar os dois containers de DI, na mesma aplicaçao vai só confundir as coisas em vez de ajudar, por exemplo, o controle de transações do spring não vai funcionar nos componentes inicializados pelo Guice, o que vai obrigar a utilização de das formas diferentes de fazer a mesma coisa na mesma aplicação, por tanto, só iria complicar sem trazer beneficios, mas esta é só a minha opinião
Quanto ao esquema do module, até que não achei tão feio, se usada apenas a interface como fiz nos exemplos, mas não gostei também do esquema do AbstractModule
e sobre os posts multi página, acho que não vou mais faze-los então, se mais alguem disser que não gostou, ai vou ter certeza que não faço mais
Valeu o comentário …
[...] Ja começou a aprender a usar o Guice? se não começou ainda, ja esta na hora, tem empresas pedindo experiência com o Guice na hora de contratar, faz um tempinho já, mas eu falei um pouco sobre o Guice aqui no blog [...]
Injeção de dependências é um padrão que deveria ser configurado em descriptors mesmo. pois sua idéia é inverter o controle de maneira fácil aka “sem abrir o código e recompilar”.
não concordo totalmente, acredito que configuração é configuração, independente de onde esteja …
[...] eu ja comentei em outro post o Guice é um framework de injeção de dependências muito fácil de utilizar. Depois de utilizar [...]
Ehhhmm… Eu só não gostei dos multiposts! Agora você pode ter certeza em não quebrar seus posts!
Bem, muito legal a sua iniciativa no site. Gostei bastante do modelo do Guice, principalmente por você não ter que usar instrumentação na jre pra ele funcionar. Por isso não me molestei com o esquema do Module não
[]‘cao