Primeiras aulas do curso Java e JSF 2 - III: Integração com CDI

Java e JSF 2 - III: Integração com CDI

Integração do CDI com JSF 2 - Pré-requisitos

Pré-requisitos

Olá alunos, bem-vindos ao terceiro treinamento sobre JSF, nesse módulo iremos focar nos CDI, no que ele pode nos oferecer.

No primeiro curso focamos nas funcionalidades principais do JSF, vimos os componentes da especificação JSF, o ciclo da vida, template entre vários outros tópicos. Para aqueles que ainda não conhecem esse primeiro modulo sobre o JSF, segue o link:

No segundo treinamento sobre JSF focamos exclusivamente nos componentes Primefaces. Usamos os componentes em todas as telas, com Ajax, Grafico, paginação nas tabelas, mascaras e muito mais.

Seguem os links dos treinamentos anteriores:

Preparando o ambiente

Você pode realizar os downloads e configurações iniciais aqui.

Integração do CDI com JSF 2 - Problemas do alto acoplamento

Problemas do alto acoplamento

Um dos principais assuntos discutidos quando começamos a trabalhar com Orientação a Objetos é a questão de manter o baixo acoplamento e a alta coesão.

Crescemos no mundo OO ouvindo isso de todos os lados, mas de fato, qual o real problema que o alto acoplamento nos traz? Primeiro, precisamos entender o que é um código acoplado.

Um código com alto acoplamento é quando uma classe conhece muitos detalhes de suas dependências, de modo que qualquer alteração em uma das dependências faz com que a classe que possui a dependência tenha que ser alterada.

Em nosso código, temos um exemplo claro do quão o alto acoplamento pode ser maléfico. A classe DAO requisita dentro do método existe um objeto do tipo EntityManager, através da classe JPAUtil, onde centralizamos a criação dos nossos EntityManagers.

Suponha que a classe JPAUtil precise agora instanciar EntityManagers de algum outro banco de dados e não somente do único banco presente no arquivo persistence.xml. Precisaríamos, neste caso, que a classe JPAUtil fosse alterada para ter dois tipos de EntityManagerFactory, uma para cada unidade de persistência que trabalhamos.

A classe JPAUtil precisará saber a partir de qual EntityManagerFactory ela criará as instâncias de EntityManager. Uma possível estratégia, seria passar na chamada do método getEntityManager uma String ou algo similar, que diga à classe JPAUtil qual EntityManagerFactory utilizar para criar o EntityManager. Teríamos um código parecido com este:

public class JPAUtil {

    private static EntityManagerFactory emf = 
        Persistence.createEntityManagerFactory("livraria");

    private static EntityManagerFactory emf2 = 
        Persistence.createEntityManagerFactory("banco");

    public EntityManager getEntityManager(String factory) {
        if ("notas".equals(factory)) {
            return emf.createEntityManager();
        } else if("notas2".equals(factory)) {
            return emf2.createEntityManager();
        }
    }
}

Automaticamente, teremos um erro de compilação dentro da classe DAO e não somente nela, mas em todas as classes que fazem referência a classe JPAUtil, e que na atual abordagem que estamos usando, podem vir a se tornar muitas. Um claro indício que nosso código está acoplado demais.

Um outro teste simples seria introduzir um novo parâmetro no construtor do DAO, por exemplo:

public DAO(Class<T> classe, boolean loga) {
    this.classe = classe;
}

Logo recebemos vários erros de compilação. Estamos espalhando a criação do nosso DAO pelos beans do JSF, praticamente sem controle. Mais um claro indício que nosso código está acoplado demais.

Estratégias para diminuir o acoplamento

Vimos que a maneira que estamos trabalhando atualmente em nosso design está mais atrapalhando do que ajudando. Isso graças ao alto grau de acoplamento que obtivemos ao longo do tempo. Mas como resolver isso? Como desacoplar o código e não afetá-lo com qualquer mudança?

A fábrica de EntityManager que criamos e chamamos de JPAUtil pode ser considerada uma forma de diminuir o acoplamento em nossas classes. Ela nos poupa de termos que criar o EntityManagerFactory toda vez que precisarmos de um.

Porém, como vimos anteriormente, ela nos ajuda mas ainda assim o acoplamento é grande.

O grande problema é que o código da classe DAO busca a dependência que precisa para realizar suas tarefas. Isso também aplica-se para os beans do JSF, todos eles buscam as dependências. E se ao invés de buscarmos esta dependência, recebêssemos ela? A classe DAO passaria agora a receber qualquer EntityManager, não importando de onde ele veio. Em nossos testes, poderíamos criar o EntityManager com base em um banco de dados em memória, por exemplo, o HyperSql Database (HSQLDB), ou ainda nem usar um banco de dados, simulando o objeto.

Inversão de controle

Queremos arrumar a nossa camada de persistência, mas infelizmente o JSF sozinho não consegue resolver esses problemas de acoplamento.

Precisamos de um framework que consegue gerenciar o EntityManager e o nosso DAO. Todos esses news espalhados pela aplicação devem sumir!

O framework que tem todo esse poder dentro da especificação JavaEE é o CDI. O "Context and Dependency Injection for the Java EE platform" (CDI) é uma especificação que diz como devemos trabalhar com nossas dependências. Ele assume o gerenciamento delas, define quanto tempo vivem e quando criar.

Nosso objetivo então é integrar o JSF com CDI para arrumar a nossa camada de persistência, mas antes de realmente arrumar a casa, vamos integrar os dois frameworks.

Integração do CDI com JSF 2 - ManagedBeans com CDI?

ManagedBeans com CDI?

Você deve se lembrar que usamos a anotação @ManagedBean para declarar um bean gerenciado pelo JSF. Repare que eu falei gerenciado! O JSF também tem inversão de controle, mas apenas para ManagedBeans. Através dessa anotação, falamos para o JSF tomar conta dos nossos beans, o JSF então cria, quando precisar, um novo ManagedBean. Normalmente isso acontece quando usarmos a expression language acessando o bean.

Agora não queremos mais que o JSF gerencie esses beans, pois isso vai ser o trabalho do CDI. E o CDI é tão poderoso que não só gerencia os beans, como também os DAOs e o EntityManager!

Configuração do CDI

Chega de papo então, vamos começar a usar o CDI! O primeiro passo é baixar o JAR. A implementação do CDI se chama WELD e como estamos dentro de um servlet container, usaremos o weld-servlet.jar.

Esse JAR deve ficar dentro da pasta WebContent/WEB-INF/lib.

Como qualquer outra especificação, o CDI também precisa de uma configuração inicial, na verdade são duas pequenas configurações. A primeira é o arquivo context.xml, que fica no diretório WebContent/META-INF:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Resource name="BeanManager"
        auth="Container"
        type="javax.enterprise.inject.spi.BeanManager"
        factory="org.jboss.weld.resources.ManagerObjectFactory"/>
</Context>

O CDI chama o gerenciador, um BeanManager, e nesse arquivo declaramos exatamente qual BeanManager concreto queremos utilizar. Quando o Tomcat sobe, ele carrega automaticamente esse arquivo e inicializa o CDI (o BeanManager), ok?

A segunda configuração é o arquivo especifico do CDI. A especificação servlet tem web.xml, JSF tem o seu faces-config.xml e o CDI tem o seu beans.xml. Esse arquivo deve ser criado na pasta WebContent/WEB-INF (ao lado dos "irmãos" web.xml e faces-config.xml):

<!-- WebContent/WEB-INF/beans.xml -->
<beans>
</beans>

O beans.xml ficará vazio por enquanto, mas veremos mais para frente configurações nele.

Sobre o curso Java e JSF 2 - III: Integração com CDI

O curso Java e JSF 2 - III: Integração com CDI possui 204 minutos de vídeos, em um total de 48 atividades. Gostou? Conheça nossos outros cursos de Java em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Java acessando integralmente esse e outros cursos, comece hoje!

  • 971 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

Premium

  • 971 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$75
à vista R$900
Matricule-se

Premium Plus

  • 971 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$100
à vista R$1.200
Matricule-se

Max

  • 971 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$120
à vista R$1.440
Matricule-se
Procurando planos para empresas?
Acesso por 1 ano
Estude 24h/dia onde e quando quiser
Novos cursos toda semana