Artigo do tipo Exemplos Práticos
Aventure-se com o Google Guice
Este artigo apresenta o framework open source de injeção de dependências do Google, chamado Guice. Durante o estudo, será construído um pequeno sistema baseado em JSF e nos padrões de projeto MVC, DAO e Service Facade, como forma de demonstrar a injeção de dependências ao leitor a partir do Guice.

Em que situação o tema é útil
Este tema é útil para os desenvolvedores Java que desejam adotar a injeção de dependências em suas aplicações de forma simples e produtiva com o uso do framework Google Guice. Este artigo serve como um material introdutório para este fim, abordando em seu conteúdo os princípios de DI. Dentre as vantagens conquistadas ao adotar a injeção de dependências, destaca-se, principalmente, a redução do grau de acoplamento entre as classes, o que resulta de forma direta na facilidade de tarefas como compreensão e manutenção do código.

O Guice (pronunciasse: juice) é um framework desenvolvido pelo Google para injeção de dependências que utiliza as mais modernas características do Java. A injeção de dependências (Dependency Injection – DI) é um conhecido padrão de projeto que possibilita um baixo nível de acoplamento entre os módulos de um sistema, tendo como finalidade injetar em cada componente suas dependências. Ao invés de você instanciar os objetos, eles são instanciados para você, sempre que isto for necessário dentro do ciclo de vida da sua aplicação. Em Java, o Spring talvez seja o framework de DI mais famoso na linguagem, e com o lançamento da plataforma Java EE 6, foi disponibilizado um recurso de DI chamado Contexts and Dependency Injection, mais conhecido como CDI.

Os desenvolvedores do Google idealizaram o Guice inicialmente para o projeto AdWords. Com o passar do tempo, o Guice foi inserido em diversos outros projetos do Google, como também disponibilizado tempos depois para uso pela comunidade sob a licença Apache 2.0 (veja mais informações na seção Links). Atualmente ele está na versão 3 e pode ser utilizado em sistemas que adotam a versão 5 do Java ou alguma posterior.

O principal objetivo do Guice é ser um framework leve e totalmente configurável a partir do próprio código Java, isto é, sem a necessidade de configurações por meio de arquivos XML. É possível utilizá-lo em projetos que adotem OSGI, Struts, Swing, JPA, Servlets e sistemas Android, com o uso do RoboGuice. Outro ponto importante é que a versão 3 é também baseada na JSR 330 (veja Links), especificação criada para padronizar os componentes de Injeção de Dependências entre os frameworks.

De acordo com informações disponíveis na documentação do Guice, ele visa tornar o desenvolvimento e depuração mais fáceis e rápidos. Por se tratar de um framework de injeção de dependências, algumas pessoas têm a tendência de compará-lo diretamente com o Spring, mas os próprios idealizadores do Guice dizem que não existe uma comparação direta e que ele nem foi construído para isso, já que nasceu de uma necessidade interna da empresa. Eles dizem também ter tirado muito proveito do que o Spring já oferecia para desenvolver a sua própria ferramenta de injeção de dependência, e até que os desenvolvedores do Spring tiveram acesso a todo o código fonte do Guice, mesmo antes de sua primeira versão ser lançada, possuindo acesso ao repositório dos fontes desde então.

Neste contexto, o artigo apresentará alguns conceitos e técnicas básicas de como fazer uso da injeção de dependências gerenciadas pelo Guice. Assim, será demonstrado, por meio de um pequeno projeto, como usar os recursos do Guice com Hibernate e JavaServer Faces 2.

Download e instalação

Na página oficial do Google Guice (veja a seção Links) é possível encontrar os arquivos necessários para download, sua documentação e também um bom material de apoio ao usuário que contém dicas e exemplos de como utilizar o framework. O download das bibliotecas necessárias para uso do Guice pode ser feito por meio desta página ou de um repositório Maven (ver seção Links), ferramenta de gerência de projetos que permite ao desenvolvedor adicionar, a partir de um arquivo XML, as bibliotecas externas do projeto, como também realizar a compilação e empacotamento do sistema.

No projeto que será apresentado como exemplo neste artigo, vamos fazer uso do Maven para gerenciar as bibliotecas externas. Observe na Listagem 1 o trecho do pom.xml que declara as dependências necessárias para trabalhar com o Guice.

Listagem 1. Dependências Maven do Google Guice.


   <dependency>
   <groupId>com.google.inject</groupId>
   <artifactId>guice</artifactId>
   <version>3.0</version>
  </dependency>
  <dependency>
   <groupId>com.google.inject.extensions</groupId>
   <artifactId>guice-servlet</artifactId>
   <version>3.0</version>
  </dependency>

Na Listagem 1, a dependência <artifactId>guice</artifactId> é responsável por adicionar ao projeto o DI do Guice, e <artifactId>guice-servlet</artifactId> fornece as classes para integração do Guice com aplicações baseadas em servlets. Já na Listagem 2 temos as demais bibliotecas adicionadas ao projeto, como Hibernate, MySQL e as bibliotecas referentes ao JSF 2.

Listagem 2. Dependências Maven para o Hibernate e JSF 2.


   <dependency>
   <groupId>com.sun.faces</groupId>
   <artifactId>jsf-api</artifactId>
   <version>2.1.7</version>
  </dependency>
  <dependency>
   <groupId>com.sun.faces</groupId>
   <artifactId>jsf-impl</artifactId>
   <version>2.1.7</version>
  </dependency>
  <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>jstl</artifactId>
   <version>1.2</version>
  </dependency>
  <dependency>
   <groupId>org.primefaces</groupId>
   <artifactId>primefaces</artifactId>
   <version>3.3.1</version>
  </dependency>
  <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-core</artifactId>
   <version>4.1.1.Final</version>
  </dependency>
  <dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.9</version>
  </dependency> ... 

Quer ler esse conteúdo completo? Tenha acesso completo