CDI é a especificação do Java EE para lidar com contextos (diferentes estados da aplicação e seus objetos relacionados) e injeção de dependências. Essa especificação se integra tão bem e de forma tão natural ao restante da plataforma Java que, muitas vezes, seus recursos são utilizados mesmo quando o desenvolvedor não conhece os detalhes da especificação.
Quando o assunto é CDI, para aqueles que conhecem apenas o básico da especificação, o primeiro assunto que vem à cabeça são os recursos relacionados à injeção de dependências, como: a injeção de dependência em si, por meio da anotação @Inject; a produção de beans, por meio da anotação @Produces; e a definição de escopo dos beans por meio da anotação @SessionScoped. CDI, no entanto, oferece muitos outros recursos que podem melhorar ainda mais a arquitetura da aplicação, tanto em termos de acoplamento, quanto em termos de coesão e granularidade, de forma a evitar que o código se torne complexo e custoso de se manter.
Entre os recursos que muitas vezes passam despercebidos pela maioria dos desenvolvedores estão os interceptors e os decorators. Com base nisso, nos próximos tópicos analisaremos esses recursos através de diferentes cenários nos quais eles são indicados.
Interceptors
Interceptors, ou interceptadores, em CDI, são filtros que permitem executar operações antes ou depois das chamadas a métodos e que podem, inclusive, substituir a chamada ao método original. Os interceptadores se baseiam em anotações, métodos e classes para definir ou não a sua execução, e são úteis em muitos cenários, como incluir um cabeçalho padrão em todas as respostas HTTP. Esse mecanismo simplifica a implementação de pequenos trechos de código em diferentes pontos da aplicação com o mínimo de alterações.
Como será possível notar a partir de agora, existem vários tipos de interceptadores, entre eles: @AroundInvoke, que intercepta métodos determinados pelo desenvolvedor por meio de anotações; @AroundTimeout, que intercepta métodos invocados pelo serviço de timer do Java EE (veja a seção Links para saber mais sobre o serviço de timer); e interceptadores de ciclo de vida, que interceptam a construção e destruição de beans, como o @AroundTimeout.
A Figura 1 ilustra o funcionamento de alguns interceptadores em uma invocação a um método. Quando se habilita a CDI no projeto, a chamada a qualquer método sempre será executada em um contexto CDI. Dessa forma, caso o método invocado ou a classe na qual ele foi implementado sejam anotados com um interceptador, esse interceptador será disparado, encapsulando e gerenciando a invocação do método. Esse mecanismo é excelente para definir requisitos transversais, como a implementação de logs ou de segurança em toda a aplicação. Para saber mais sobre requisitos transversais, veja o BOX 1.
Requisito transversal é um termo que vem, pouco a pouco, substituindo o termo requisito não funcional. Um requisito transversal representa comportamentos transversais do sistema, ou seja, comportamentos que deveriam ser implementados em todos os módulos, definindo restrições, atributos de qualidade e/ou a forma de operação.
Exemplos de requisitos transversais incluem segurança, desempenho e escalabilidade. Eles dizem respeito a toda a aplicação, por exemplo: não faz sentido definir um controle de acesso por meio de uma tela de login sem um mecanismo que controle o acesso a todas as telas do sistema, ou ainda definir requisitos de escalabilidade ou desempenho sem considerar a aplicação como um todo.
Tendo em vista a importância dos requisitos
transversais, muitas abordagens surgiram para melhorar a implementação dos
mesmos pela aplicação. O esforço mais conhecido nessa área é a programação
orientada a aspectos, implementada por frameworks como AspectJ e Spring AOP,
que, inclusive, foram grandes responsáveis pela popularização do termo
requisitos transversais. Além disso, mecanismos como os Interceptors na API de
Servlet e na CDI ofer ...
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com
vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa
bagagem consegui um estágio logo no início do meu primeiro
período na faculdade. Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo. Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a
pena, pois a plataforma é bem intuitiva e muuuuito
didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito
obrigado! Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento
front-end, tinha coisas que eu ainda não tinha visto. A
didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado,
adorando demais. Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É
um passo a passo incrível. Só não aprende quem não quer.
Foi o melhor investimento da minha vida! Foi um dos melhores investimentos que já fiz na vida e tenho aprendido
bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da
programação, irei assinar meu contrato como programador
graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana,
aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem
como não aprender, estão de parabéns! Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de
seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com
React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo
muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na
área.Confira outros conteúdos:
Perguntas frequentes
Nossos casos de sucesso
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.