Motivação
O CDI, acrônimo de Contexts and Dependency Injection, é uma especificação Java, criada a partir da JSR-299 (Java Specification Request), responsável por fazer o controle da injeção de dependências nas aplicações.
Por ser uma especificação, várias implementações foram feitas com base no CDI, como o JBoss Weld, Resin CanDI e Apache OpenWebBeans. No entanto, apesar de serem ferramentas distintas, elas requerem do desenvolvedor, basicamente, o conhecimento das mesmas anotações e técnicas de configuração estabelecidas pelo CDI.
Neste artigo veremos como utilizar essa especificação em um projeto Java, nos concentrando no JBoss Weld, implementação de referência dessa especificação.
Adicionando o CDI ao projeto com o Weld
Na página do Weld você pode encontrar todas as versões disponíveis para download. Entre elas, optamos pela 2.4.1.Final. Usaremos, ainda, o Maven, para adicionar o Weld ao nosso projeto sem nos preocuparmos com as dependências. Para isso, o primeiro deve ser a configuração do arquivo pom.xml, como mostra a Listagem 1.
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>2.4.1.Final</version>
</dependency>
O próximo passo é adicionar um arquivo chamado beans.xml ao diretório src/main/webapp/WEB-INF/. Esse arquivo habilita o CDI no seu projeto, mesmo estando sem configurações. A Listagem 2 apresenta o seu conteúdo.
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.2" bean-discovery-mode="all">
</beans>
Observe que declaramos o atributo version com o valor 1.2, especificando exatamente a versão do CDI que vamos utilizar. Um outro atributo importante é o bean-discovery-mode, declarado com o valor “all”. Isso indica que o CDI deverá buscar tanto por anotações quanto por arquivos XML que possuam a declaração dos beans que devem ser gerenciados.
Injetando seu bean
Para que seu bean torne-se gerenciável, é preciso adicionar a ele ao menos a anotação @Named, que dirá ao CDI que esse bean deve ser gerenciado, possibilitando a injeção do mesmo em outros beans através da anotação @Inject. Na Listagem 3 temos um exemplo de criação de um bean gerenciável.
package br.com.devmedia;
import javax.inject.Named;
@Named
public class MeuBeanGerenciavel {
public void executarRotina(){
//TODO: Rotina desejada aqui
}
}
Nesse trecho de código, criamos uma classe de exemplo com um método executarRotina(), e anotamos a classe com @Named. Dessa forma, ela poderá ser usada em outros pontos do projeto sem a necessidade de utilizarmos o operador new. Na Listagem 4 apresentamos um exemplo de como injetá-lo em um outro bean, bem como fazer uso dos seus métodos normalmente.
package br.com.devmedia;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;
@Named
public class MinhaClasseUtil {
@Inject
private MeuBeanGerenciavel bean;
@PostConstruct
public void init(){
bean.executarRotina();
}
}
Note que nessa listagem criamos uma classe com a mesma anotação @Named usada na listagem anterior. Assim, esse bean também se torna gerenciável, do mesmo modo que a classe criada na Listagem 3. O primordial aqui é notar o uso da anotação @Inject, que irá, automaticamente, criar uma instância da classe MeuBeanGerenciavel e colocá-la dentro do objeto que nomeamos de “bean”.
Feito isso, podemos fazer a chamada a qualquer método que esteja acessível na classe injetada, como é o caso do executarRotina(). Usamos, também, a anotação @PostConstruct, fazendo com que o método init() seja chamado imediatamente após a construção do bean MinhaClasseUtil. Anotações como essa são úteis para casos em que é necessário carregar algo ou fazer alguma verificação, por exemplo, ao criar/destruir um bean.
Assim como as apresentadas nesse artigo, o CDI possui diversas outras anotações, recursos e técnicas disponíveis que o tornam tão robusto e completo. Sendo assim, quando houver a necessidade de empregar injeção de dependências em seus projetos, considere o uso de uma das implementações dessa especificação.