Olá Pessoal, tudo bom?
No artigo de hoje iremos ver um pouco da história do CDI. Veja na continuação desse artigo.
CDI – definição
A sigla CDI significa Context Dependency Injection for Java EE.
A injeção de dependência nada mais é do que deixar a especificação assumir qual seria a forma de instanciar um objeto de uma determinada classe.
Por exemplo, em um projeto que não use CDI, provavelmente foi utilizado alguns conceitos de singleton e factory. O CDI ajuda a remover esse tipo de conceito do sistema. Não estou dizendo que utilizar os padrões seja ruim, muito pelo contrário, é que algumas tarefas se tornam bem mais simples utilizando especificações que no fim das contas irão realizar a mesma atividade.
Origens do CDI
A história do CDI é dividida em duas partes. A primeira com Gavin King e o Seam Framework e a segunda com Rod Johnson e o Spring Framework.
Seam Framework e a JSR-299
Em 2005, Gavin King (criador também do Hibernate) cria o Seam Framework em sua versão 1.0. Esse framework tem o objetivo de reduzir a complexidade de operações de Injeção de Dependência nos projetos que utilizavam JSF (Java Server Faces) e EJB (Enterprise Java Beans).
No ano de 2007, o Seam passou a ter uma versão 2.0, o qual foi o rascunho da JSR-299 (JSR-299: Contexts and Dependency Injection for the JavaTM EE platform) ((JSR-299 – link)). Em sua versão 2.0 também o Seam passou a trabalhar com Web Beans ((Web Beans Specification – link)) o qual é uma classe Java que contém regras negociais, mas que pode ser acessada via código Java ou Expression Language. No ano de 2009 a JSR-299 tem fechada a sua versão final.
Spring Framework e a JSR-330
Em 2004, Rod Johnson cria o Spring Framework na versão 1.0. Esse framework tem o objetivo de reduzir a complexidade do container JEE (Java Enterprise Edition)
No ano de 2007, tem-se o inicio do rascunho da JSR-330 (JSR 330: Dependency Injection for Java) ((JSR-330 – link)). A qual teve sua versão final no ano de 2009
Resumo da Opera das JSRs
Legal. O java passou a possuir duas especificações para Injeção de Dependência:
- JSR-299: Contexts and Dependency Injection for the JavaTM EE platform
- JSR 330: Dependency Injection for Java
A pergunta é: Pra que? Ambas não especificam a mesma coisa?
A resposta é: Sim! e Não também!
A relação entre as especificações JSR-299 e JSR330 está como o JPA (Java Persistence API) e o JDBC (Java Database Connectivity). O JPA utiliza-se do JDBC, pois o JDBC é a especificação responsável por conversar com o banco de dados. Porque então o JPA iria reinventar a roda? Logo ele faz o trabalho dele, automatizar a relação entre entidades e tabelas, mas para a comunicação com o banco de dados utiliza-se do JDBC.
Aqui é a mesma coisa, a JSR 330 contextualiza a injeção de dependência dentro da Linguagem Java, já a JSR-299 utiliza-se da JSR-330 para realizar o seu trabalho de injeção dependência dentro do contexto JEE.
Pequeno detalhe de padronização de Software
Entendido o aspecto das JSRs, mas ainda temos dois frameworks que fazem essa injeção de dependências, qual deles se tornou o padrão da especificação? Como é o Hibernate Validator para a especificação de Bean Validation. No caso do CDI foi criado um novo framework chamado JBoss Weld. Algumas das atividades realizadas pelo JBoss Weld e CDI em geral:
- Uma forma de prover e gerar objetos com estado (stateful)
- Injeção de dependências com type-safe, ou seja, trazer objetos do tipo desejado, sem serem de outros formatos.
- Injeção de dependências para diferentes ambientes (desenvolvimento, homologação, produção) sem a necessidade de configurações complexas
- Integração com Expression Languages, podendo ser utilizada com JSP e JSF.
- Notificação de eventos
- Criação de Interceptors
- Capacidade de prover uma SPI (Service Provider Interface), podendo criar novas extensões a especificação.
CDI 2.0
Atualmente existe uma nova JSR para o CDI, chamada de CDI 2.0 ou JSR 365: Contexts and Dependency Injection for JavaTM 2.0 ((JSR-365 – link)), que é a atualização e união das JSR 299 e JSR 330.
Essa JSR está atualizada para a versão do JEE 8.0 e sua versão final saiu em maio de 2017. A documentação oficial se encontra no seguinte link.
As principais mudanças foram:
- A divisão da especificação em 3 partes: CDI Core, CDI SE e CDI JEE.
- Melhorias na programação Assíncrona.
- Interfaces de configuração facilitando a mudança de informações on the fly.
- Factory para a criação de interceptadores
- Adição das principais funcionalidades do Java SE 8, como lambda e streams.
finnaly{
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply