sábado, 18 de julho de 2015

Configurando aplicação JavaSE com CDI.

Olá mais uma vez !

É a primeira vez que irei postar algum conteúdo sobre a maravilha que é o CDI. Muitas vezes por não conferirmos a documentação da especificação alguns detalhes passam desapercebidos. Pois é, vocês sabiam que o CDI também pode ser configurado em aplicações JavaSE ? Eu sinceramente não sabia. Enfim, leia até o fim e aprenda como configurá-lo em aplicações Standalone que utilizam Maven para gerir as dependências.


Por preferência pessoal utilizarei o NetBeans, mas nada impede que sejam utilizadas as IDE's de sua preferência.

Mostrarei apenas os pontos importantes das configurações, caso queira ver informações mais completas você pode conferir a própria documentação do CDI. Também deixarei abaixo alguns links que me ajudaram nessa jornada (sim, realmente quebrei a cabeça algumas vezes, e tudo por não olhar a documentação direito). Bem, chega de conversa e mostre o código !

Primeiramente vamos ao famoso pom.xml:
 
        
            org.jboss
            jandex
            1.2.4.Final
        
        
        
        
            org.jboss.weld.se
            weld-se
            2.2.14.Final
        
Agora temos que criar um arquivo chamado beans.xml. Para aplicações SE, será necessário você colocá-lo dentro da pasta META-INF. No meu projeto o diretório ficou da seguinte forma:
D:\NetBeansProjects\JavaSECDI\src\main\resources\META-INF\beans.xml. Criei a pasta resources e META-INF por fora da IDE.



Vamos agora a classe Main. Esta ficou realmente com uma cara estranha, mas analisando um pouco e lendo a documentação, tudo faz sentido:
public class Main {

    public void main(@Observes ContainerInitialized event, @Parameters List params) {

    }

}
Na verdade, esta não será mais a classe principal da sua aplicação. Agora você deve configurar o seu projeto para executar a classe seguinte: org.jboss.weld.environment.se.StartMain No NetBeans encontrei um pouco de dificuldade, pois diferente do Eclipse, quando ele não encontra uma classe java Principal, não é sugerido ao usuário escolher qualquer outra classe da aplicação para iniciar o projeto, o que acontece é que simplesmente ele retorna um erro, dizendo que não há classe principal no projeto. Para configurar isso, vá até seu projeto, e na Janela Projetos, clique com o botão direito sobre ele e vá em Propriedadas > Executar > Classe Principal e cole org.jboss.weld.environment.se.StartMain. Se clicar em procurar ele não irá te informar nada, apenas cole e clique em OK.

Vamos criar uma classe para testar injeção de dependência:
public class ClasseParaInjecao {

    public void testarInjecao() {
        System.out.println("Injeção funcionado !!!");
    }

}
Código para teste na classe main:
public class Main {
    
    @Inject
    ClasseParaInjecao classeInjetada;

    public void main(@Observes ContainerInitialized event, @Parameters List params) {
        classeInjetada.testarInjecao();
    }
}
Agora é só iniciar aplicação. Se estiver tudo correto será apresentada a mensagem "Injeção funcionando !!!" no console.

Vamos explicar algumas coisas:
beans.xml

É usado para configurar alguns recursos do CDI, como interceptadores, decoradores etc. A tag de configuração bean-discovery-mode="all", determina a maneira como as classes serão encontradas para satisfazer as dependências.

Classe Main:
A anotação @Observes a grosso modo, ficará de olho no evento ContainerInitialized que será disparado assim que a classe org.jboss.weld.environment.se.StartMain for chamada para iniciar a aplicação. 
Já a anotação @Parameters é usada para receber os tradicionais parâmetros por linha do comando do Java, é equivalente ao String [] args.

Abaixo alguns links que me ajudaram muito na configuração e serviram de fonte para este post.

Documentação Weld.
http://weld.cdi-spec.org/documentation/

Como iniciar o CDI em diversas aplicações Java.
http://antoniogoncalves.org/2011/01/12/bootstrapping-cdi-in-several-environments/

Motivos para usar o CDI.
http://blog.caelum.com.br/use-cdi-no-seu-proximo-projeto-java/

Dúvida sobre bean-discovery-mode no StackOverFlow.
http://stackoverflow.com/questions/18310388/meaning-of-bean-discovery-mode-annotated-in-cdi-1-1

Capítulo da documentação sobre o CDI em JavaSE:
https://docs.jboss.org/weld/reference/latest/en-US/html/environments.html#_bootstrapping_cdi_se

Dúvidas nos comentários. Responderei sempre que possível.
Nos próximos posts pretendo trazer mais sobre CDI com JavaSE, o passo inicial já foi dado !

Até a próxima !!!


Um comentário :