Dev (Back & Front)ARTIGO

Utilizando o Google Guice

O Google Guice é um OpenSource framework que fornece Injeção de Dependência(DI), através de anotações. Há outros frameworks que fazem isso também, os mais conhecidos são PicoConteiner e o Spring. A principal diferença entre eles e o Google Guice é que o PicoConteiner faz a injeção de dependências programaticamente, o Spring atráves de XML e o Google Guice pode ser feito através de anotações. O Google Guice também influenciou bastante a JSR-330, se não me engano até o pessoal de lá participou do desenvolvimento da JSR, Google Guice já implementa essa JSR conforme no site deles – http://code.google.com/p/google-guice/wiki/JSR330.

O que é a Injeção de Dependência?

A injeção de dependência é um design pattern que visa desacoplar os componentes da aplicação. Os componentes são instanciados externamente à classe. Um gerenciador controla essas instâncias. Esse gerenciador, através de uma configuração, liga os componentes de forma a montar a aplicação, ou seja, utilizamos a Injeção de Dependência quando é necessário manter baixo o nível de acoplamento entre diferentes módulos de um sistema.

Vejo também que a Injeção de Dependência facilita o desenvolvimento voltado a Interfaces, ou seja, podemos trocar a implementação sem nos preocupar com as classes que já utilizavam desta interface e com a injeção de dependência podemos trocar as implementações apenas em um único local e nosso aplicativo continuará funcionando.

Um caso de uso

Um caso de uso, por exemplo, onde Injeção de Dependência manteria um baixo acoplamento em nosso software é:

Você tem uma página na Web que envia SMS, esse envio é feito por uma outra empresa, e você chama os serviços SOAP desta empresa. Na hora de renovar o seu contrato com a empresa, ela aumentou o preço em 100%. Mas felizmente existem outras empresas que fazem o mesmo serviço, porém cada uma o fornece à sua maneira, e você fechou o contrato com uma que utiliza Rest Services. E sua página Web está com aquele código que chamava o SOAP, que está espalhado.

Se no desenvolvimento dessa página Web você tivesse utilizado a Injeção de Dependências, a troca da API de envio de SMS seria o mais simples e o menos intrusivo em seu código.

A solução com Injeção de Dependência (Google Guice)

Feitas as apresentações sobre o Google Guice e como ele será útil para nosso aplicativo, vamos ao que interessa.

Vamos partir do principio de que você já criou uma estrutura javaJava42 conteúdosNovidades do Java 26 (para desenvolvedores)Dev (Back & Front) · mar 2026Visual Studio Code para Java: o guia completo (dicas, configuração e extensões)Dev (Back & Front) · out 2025Quarkus: Modernizando a linguagem Java para a era da nuvemDev (Back & Front) · nov 2020Ver tudo em Dev (Back & Front) , agora precisamos adicionar as dependências do Google Guice, você pode fazer o download desses arquivos e adicionar os JARs em seu projeto. Se você utilizar o maven, precisará dessas dependências:

<dependency><br />   <groupId>com.google.code.guice</groupId><br />   <artifactId>guice</artifactId><br />   <version>2.0</version><br /></dependency><br /><br /><dependency><br />   <groupId>aopalliance</groupId><br />   <artifactId>aopalliance</artifactId><br />   <version>1.0</version><br /></dependency>

Primeiro vamos criar nossa Interface SmsService, que é onde vamos fazer a injeção de dependência.

public interface SmsServices {<br />   String send();<br />}

Agora vamos criar duas implementações, uma para a empresa ABC e outra para XPTO.

public class SmsServicesAbcImpl implements SmsServices {<br />    @Override<br />    public String send() {<br />        return "SMS enviado pela empresa ABC";<br />    }<br />}
public class SmsServicesXPTOImpl implements SmsServices {<br />    @Override<br />    public String send() {<br />        return "SMS enviado pela empresa XPTO";<br />    }<br />}

Agora vamos criar uma classe que extends a AbstractModule do Google Guice, nela iremos definir as implementações para que vão ser injetadas na interface.

public class GuiceModule extends AbstractModule {<br />    @Override<br />    protected void configure() {<br />        bind(SmsServices.class).to(SmsServicesAbcImpl.class);<br />    }<br />}

O que fizemos foi declarar que na interface SmsServices sempre será injetado SmsServicesAbcImpl, agora vamos criar um programa main para testar.

public class MainProgram {<br />    public static void main(final String[] args) {<br />        Injector injector = Guice.createInjector(new GuiceModule());<br />        SmsServices services = injector.getInstance(SmsServices.class);<br />        System.out.println(services.send());<br />    }<br />}

O que fizemos foi pegar uma instância do Injector passar a classe, onde estão configurados os binds entre interface e implementação. Então, através do injector.getInstance(SmsServices.class), o Google Guice irá devolver a instância que definimos no GuiceModule.

Se tudo deu certo, seu resultado no console será isto:

SMS enviado pela empresa ABC

Agora precisar trocar a implementação para a da empresa XPTO. Basta alterar o arquivo GuiceModule e adicionar a implementação de XPTO. E, pronto, nosso código ficou com o acoplamento bem mais baixo.

Concluímos que nosso código ficou bem mais limpo e de fácil manipulação. E se aparecerem mais e mais implementações, pode trocar facilmente sem afetar nosso código.

É programador viciado, pós-graduado pela Universidade de São Paulo, e tem trabalhado com desenvolvimento de software há mais de quatorze anos, começando com tecnologias como PHP para Web e migrando para linguagens como Ruby, Java, JavaScript and Go. Atualmente focado no desenvolvimento mobile para Android e iOS, incluindo wearables como smartwatches. Também tem uma grande experiência acumulada com Arquitetura de Software, Micro Services, DevOps, DDD, TDD, BDD e é um entusiasta com metodologias ágeis como Scrum, XP, Lean e Kanban. Atualmente, tem estudado mais movimento de Fintechs, acumulando grande experiência na MoIP e um grande entusiasmado com a criação de ferramentas para recrutamento e seleção.

Ver perfil