Use CDI no seu próximo projeto Java

Postado em 23. mai, 2012 por Sérgio Lopes em Inovação, Java

CDI é a especificação do Java EE 6 que cuida da parte de injeção de dependências. E, além de ser oficial e estar incluída em todos os servidores de aplicação, é tão boa e produtiva que já tem gente questionando o papel do Spring nos dias de hoje.

O CDI se encaixa muito bem em todo tipo de projeto Java. Se você usa JSF2, usar CDI é natural, como mostramos no nosso curso FJ-26. Mas mesmo para aplicações Web simples, com apenas Servlets, o CDI é um grande ganho.

Habilitando CDI

Habilitar o CDI no projeto é muito simples. Se você já está usando um servidor Java EE 6, basta criar um arquivo vazio chamado beans.xml na pasta META-INF do seu projeto (ou WEB-INF num projeto web). Esse é um simples arquivo de marcação e apenas sua presença já faz com que o servidor habilite o suporte a CDI e escaneie suas classes automaticamente.

Se você estiver usando Tomcat, Jetty ou outro servidor antes do Java EE 6, ainda é possível habilitar o CDI copiando e configurando o JAR de alguma de suas implementações. Vamos usar o Weld, a implementação de referência e a mais usada (já embutida no JBoss e no Glassfish).

No caso do Tomcat, os passos de configuração são:

Feito isso, basta criar o tal arquivo META-INF/beans.xml vazio no projeto.

Tudo são beans

Com o CDI habilitado, praticamente todas as classes do projeto são consideradas managed beans e, portanto, passíveis de injeção e de serem injetadas. Podemos usar com CDI toda classe pública com um construtor público padrão ou algum que receba parâmetros e esteja anotado com @Inject.

Aliás, essa anotação @Inject é a base de todo o CDI: é ela quem permite a injeção de dependências e devemos usá-la nos pontos que queremos injeção automática, sejam construtores, setters ou atributos privados.

Essa anotação, embora usada com CDI, faz parte na verdade de uma outra especificação, a JSR330. Essa é uma especificação bastante simples, com apenas algumas anotações relacionadas à injeção de dependências no pacote javax.inject. A ideia é ter um conjunto básico de recursos para injeção a serem suportados em todos os frameworks do tipo – além do CDI, Spring, Google Guice, PicoContainer e outros frameworks suportam essas anotações.

Primeira injeção

Imagine que temos uma classe ProdutoDAO que cuida de persistir objetos Produto:

public class ProdutoDAO {
   public void adiciona(Produto produto) {
      // ... implementação
   }
}

Essa classe simples, sem nenhuma configuração particular, pode ter objetos injetados em qualquer outro ponto da aplicação. Basta usar a anotação @Inject:

public class ProdutoController {
    @Inject private ProdutoDAO dao;

    public String inserir() {
        Produto p = // ...
        dao.adiciona(p);
        return "Produto adicionado!";
    }
}

Poderíamos também ter feito a própria classe ProdutoDAO receber um EntityManager da JPA para trabalhar com a persistência:

public class ProdutoDAO {
   @Inject private EntityManager manager;

   public void adiciona(Produto produto) {
      manager.persist(produto);
   }
}

Produção de objetos

Sempre que encontrar um ponto de injeção, o CDI vai tentar instanciar a classe sendo referenciada. No caso do DAO anterior, ao criá-lo, o CDI vai tentar dar new em EntityManager.

Mas EntityManager, assim como vários outros objetos, não pode ser criado tão facilmente assim. A criação de um EntityManager exige a chamada do método createEntityManager no EntityManagerFactory correspondente. É um objeto com um processo de fabricação particular.

Nos Design Patterns, sempre que encontramos esse tipo de cenário, criamos uma Factory para aquele objeto. É um simples método que encapsula a criação não-trivial do objeto em questão. Com CDI é a mesma coisa.

Vamos criar um método em uma classe qualquer do sistema que cuide da produção de objetos EntityManager. E podemos indicar ao CDI que queremos que ele use esse método sempre que alguém pedir a injeção de um EntityManager. Fazemos isso com a anotação @Produces:

public class ProdutorEntityManager {
   private static EntityManagerFactory factory = Persistence.createEntiyManagerFactory("default");

   @Produces
   public EntityManager criaEntityManager() {
      return factory.createEntityManager();
   }
}

Agora, todos os pontos de injeção que precisarem de EntityManager irão invocar essa fábrica anotada com @Produces.

Escopos

Mas quantos EntityManagers vamos criar com o código acima? Por padrão, toda dependência no CDI possui um escopo chamado Dependant. Isso é: será instanciada tantas vezes quanto quem estiver chamando for. Certamente não é o que queremos com nosso EntityManager.

É usual criar um EntityManager por requisição em uma aplicação Web. Podemos indicar isso apenas anotando o método produtor com @RequestScoped:

public class ProdutorEntityManager {

   @Produces @RequestScoped
   public EntityManager criaEntityManager() {
      // ...
   }
}

Agora, um novo EntityManager será criado associado a um request. Se mais de uma classe pedir um EntityManager durante o mesmo request, a mesma instância será passada, evitando desperdício de recursos. Outros escopos comuns são @SessionScoped e @ApplicationScoped.

Mais: como definimos o escopo da dependência, temos agora uma visão clara de seu ciclo de vida. O objeto durará apenas um request, e será descartado quando o request acabar.

O CDI nos deixa, inclusive, executar algo na fase de descarte da dependência, ao final da requsição. No nossa caso, será muito útil para chamar o close no EntityManager. Basta criar um método que receba a dependência a ser descartada e anotar o parâmetro com @Disposes:

public class ProdutorEntityManager {

   @Produces @RequestScoped
   public EntityManager criaEntityManager() {
      // ...
   }

   public void finaliza(@Disposes EntityManager manager) {
      manager.close();
   }
}

O método finaliza será chamado automaticamente pelo CDI ao final do request e fará o fechamento do EntityManager.

Use CDI no seu próximo projeto

O CDI é extremamente completo e poderoso. Esse artigo mostrou apenas o básico e o início do trabalho. Mas seu container de injeção typesafe com anotações simples e produtivas tem muitos outros recursos. Mostrei várias funcionalidades do CDI em uma palestra no JavaOne Brasil que você pode acompanhar a seguir:

Aqui mesmo no blog já mostramos como fazer a produção de dependências de tipos genéricos. Além disso, há recursos como qualifiers, interceptadores, decorators, eventos e muito mais. Mostramos várias dessas funcionalidades no curso FJ-26 da Caelum, inclusive com o JBoss Seam 3, uma ótima companhia para o CDI.

E você, o que acha do CDI? Tem usado em seus projetos?

Sérgio Lopes ()

Mais sobre o autor

Tags: , , , , , , , ,

55 Respostas para “Use CDI no seu próximo projeto Java”

  1. Caio Ribeiro Pereira

    23. mai, 2012

    Parabéns pelo post!

    Nunca usei CDI, creio que esses exemplos já ajudarão e muito na hora de criar uma simples webapp com ele, achei ele bem mais prático que o Spring.

    Sabe me informar quando devo usar CDI e quando devo usar Spring pra injeção de depedências?

    Tipo vantagens e desvantagens de cada um?

  2. Welington Veiga

    23. mai, 2012

    Sou um fã do Spring, mas vou procurar conhecer o CDI, embora o Spring forneça muito mais que DI, em projetos menores pode-se fazer uso desse recurso sem necessidade de incorporar todo o framework.

    Parabéns pelo post.

  3. Felipe Caparelli

    23. mai, 2012

    Meus parabéns Sérgio! Didática fantástica para explicar o CDI e sua aplicação sem termos misticos!

  4. Laercio Guerço Rodrigues

    23. mai, 2012

    Spring eu questiono não é de hoje.

  5. Sérgio Lopes

    23. mai, 2012

    A gente tem um post aqui no Blog levantando pontos sobre os dois lados na discussão de Spring vs. Java EE:

    http://blog.caelum.com.br/java-ee-versus-spring-retomando-a-discussao/

    Minha opinião pessoal é que, pra maioria dos projetos, tecnicamente os dois são equivalentes. Usar um ou outro será mais por gosto e aspectos políticos na empresa. Eu gosto mais de CDI, acho bem mais fácil que o Spring, mas certamente ele tem menos recursos (o que pode ser bom).

  6. Rodrigo Galba

    23. mai, 2012

    Oi Sergio, parabens pelo post.
    Hoje eu utilizo spring nos meus projetos não apenas por conta de DI, mas também pela parte transacional e do contexto para testes de integração no proprio junit.

    Como, com CDI, eu poderia resolver isso?

  7. Sérgio Lopes

    23. mai, 2012

    Rodrigo,

    O CDI, por ser Java EE, vai se integrar legal com o resto das tecnologias Java. Então pra fazer controle transacional, por exemplo, você vai usar as transações do container EJB (e pode ser EJB Lite, Web Profile, pra não precisar de um servidor de aplicação completo).

    Outros exemplos: vá de JAX-WS pra web services, JAX-RS pra REST, Bean Validation pra validação, JPA pra persistência, EJB pra remotabilidade, JMS pra mensageria etc. E, precisando de coisas mais avançadas que o Java EE puro ainda não tem, você acaba conseguindo com frameworks de terceiros integrados (o Seam 3 é uma boa companhia pro CDI).

    De testes, até onde sei não tem nada específico. Mas não sei se precisa na verdade. Eu uso jUnit aqui com CDI normalmente. Como meus beans CDI são classes simples, é só testá-las normalmente no jUnit (e mockar as dependências).

    Abraços

  8. Danilo Miranda

    23. mai, 2012

    @segio parabéns pelo post. Estou trabalhando com CDI a pouco tempo e estou adorando!

    @rodrigo você pode baixar um projeto “quickstart” direto do Jboss pelo Jboss Tools, o projeto Kitchensink já vem com JSF2, CDI, JPA e o melhor com JUnit integrada, inclusive já tem uma classe de teste criada.
    Olha só a documentação deste quickstart https://docs.jboss.org/author/display/AS7/Kitchensink+quickstart

    Espero que ajude.

  9. Frederico Maia

    23. mai, 2012

    Parabéns pelo post Sérgio, ficou muito bom pra quem está começando. Vi um vídeo de vocês da Caelum sobre usar o CDI no VRaptor e deu pra ver o poder e simplicidade dele.
    Já estou usando no projeto atual na empresa, integrando com EJB`s, JAX-RS, JPA e etc. Ficou realmente muito bom e bem mais simples que o Spring.
    Espero que as especificações continuem seguindo essa linha de simplicidade e eficiência!

  10. Sérgio,

    Excelente artigo cara! Eu só discordo em uma coisa: CDI enquanto solução de DI é muitíssimo superior ao Spring. Agora, o Spring Framework é uma família de módulos, muitos dos quais são muito úteis e sem equivalente em qualidade. Seria muito bom se eles fossem DI agnósticos, aí seria o melhor dos dois mundos :-)

  11. Rafael Ponte

    24. mai, 2012

    Oi Sergio,

    Excelente post, principalmente as dicas sobre como colocar CDI em container mais leves.

    Eu sinceramente acho que o CDI conseguiu superar o Spring em termos de design e até simplicidade, porém a stack do Spring continua, na minha opinião, muito mais completa, principalmente no módulo Spring Testing, na qual nos permite escrever testes de integração facilmente sem necessidade de qualquer modificação no código de produção.

  12. Thiago Marinho

    25. mai, 2012

    Opa, Muito bom o post, Obrigado. Também gostei de saber das dicas de utilizar CDI em container leve como TomCat.

  13. Luca Bastos

    25. mai, 2012

    Concordo…

    Só acrescento um pouco de história.

    Porque surgiu o Spring?

    Porque o Java EE era um LIXO, coisa que saiu de uma cabeça completamente obtusa, influenciada por empresas que queriam vender bilhões e que tinham total interesse que o Java EE fosse complicado para justificar a necessidade dos seus servidores.

    Vou mais além.

    Estas empresas e seus interesses comerciais, podem ter ajudado a Sun na escolha deste nome IMBECIL, ou seja, Java para enterprise. O mundo todo web, as empresas web predando todos os negócios em todas as áreas, as grandes corporações (as enterprises) fazendo projetos web e o Java desprezando este mercado.

    Mas isto é assunto para um post inteiro.

    O que eu queria dizer é que para o atual JEE (argh, os burros ainda mantém o E), o Spring só é necessário para outras coisas não exatamente àquelas para o que foi criado.

    A menos que alguma implementação CDI se mostre com desempenho muito inferior ao Spring, coisa meio difícil de acontecer, ou que se use outras facilidades do Spring, não vejo sentido em usar Spring para injeção de dependências. Viu Sr VRaptor…

  14. Sérgio Lopes

    25. mai, 2012

  15. Rafael

    26. mai, 2012

    Eu uso e recomendo, muito bom, leve, não é necessário a quantidade de anotações que o Spring tem…O CDI veio pra ficar..

  16. Antonio

    29. mai, 2012

    Muito legal o post… Apenas 1 detalhe… o beans.xml e o context.xml ficam na pasta META-INF ou na WEB-INF ??

  17. Sérgio Lopes

    29. mai, 2012

    Ficam na META-INF, Antonio

  18. Antonio

    29. mai, 2012

    Oi Sérgio, é que para Web Applications o beans.xml deve ficar na WEB-INF, conforme o comentário do tutorial da Oracle…

    http://docs.oracle.com/javaee/6/tutorial/doc/gjbnz.html

  19. Sérgio Lopes

    29. mai, 2012

    Eita, bom saber. Fui conferir também na documentação do Weld e ele fala que funciona nos dois mesmo (META-INF e WEB-INF). O mais certo deve ser então no WEB-INF para wars. Mas o arquivo do Tomcat (context.xml) esse é no META-INF mesmo.

    Valeu pela dica!

  20. Tiago

    31. mai, 2012

    Legal o post. Sobre o Seam 3, que é uma excelente ferramenta para trabalhar com CDI, pelo que tenho lido o mesmo está fadado a ser descontinuado (devido às diversas críticas que essa versão sofreu por ser completamente diferente do Seam 2.x) e a Jboss deve iniciar um novo projeto com a Apache (que me falta o nome agora hehe). Os colegas têm mais informações sobre isso?

    Também recomendo uma olhada pra quem se interessar no Apache CODI, “is your best friend for CDI based projects”. Ao menos é o que diz no site, né? Eu usei um pouco e gostei!

    Obrigado.

  21. Marcio Rosa

    31. mai, 2012

    Aqui na empresa usamos CDI com produções para injetar EJB, WS, JTA, DAOS, … sem duvida é um ganho muito significativo para sua aplicação eu recomendo muito !

    Sérgio ainda não fui pegar minha apostila de arquitetura rs

    Ótimo POST

    Abraço

  22. Moacir R.F

    31. mai, 2012

    Excelente artigo!
    Que genial essa nova especificação!, não sabia que era possível utilizar no tomcat.

  23. Jaabax

    08. jun, 2012

    Muito obrigado pelo post Sérgio… Mais tenho uma dúvida… A maneira que vc publicou no post é a maneira correta de se criar EntiyManagers dinamicamente? Preciso criar EntityManagers para um ERP multitenancy. Lí no tutorial do JEE 6 que se eu usar @PersistenceUnit em um EntityManagerFactory eu perco o gerenciamento do container, como transações e etc. Eu até perguntei isso na comunidade JBoss mas ninguém respondeu: https://community.jboss.org/thread/200658?tstart=60

  24. Sérgio Lopes

    08. jun, 2012

    O post foca apenas no container CDI e não exige o uso do restante do Java EE (tanto que o exemplo é dado rodando no Tomcat, um servlet container básico).

    Mas, na prática, se você usar um servidor Java EE full (JBoss, Glassfish etc), você pode e deve usar o gerenciamento de conexões e entity managers do servidor de aplicações. Aí você ganha controle transacional etc como você disse.

  25. Jaabax

    08. jun, 2012

    Obrigado pela resposta Sérgio. Então pelo visto vou ter que continuar utilizando o @PersistenceContext em cada uma das minhas variáveis de instância do tipo EntityManager. Hoje eu faço assim: Se meu servidor 1 tem 20 clientes, crio um projeto com um GenericDAO com 20 variáveis de instância do tipo EntityManager anotadas com @PersistenceContext (cada cliente com sua base de dados). No servidor 2 faço a mesma coisa. Daí faço build selecionando o projeto dependendo do servidor. O que vc acha disso? Outra coisa, eu não consigo entender o @Produces… Pode me explicar por favor? Se createEntityManager() já cria um EntityManager, pra que anotar o método com @Produces? Mais um vez muito obrigado. :D

  26. Sérgio Lopes

    08. jun, 2012

    Me parece uma boa solução essa sua.

    E do @Produces, o que ele faz é expor o objeto retornado pelo seu método para o CDI. O método é um método simples como você disse, que constrói o objeto e pronto. Mas pra você poder injetar esse objeto em outros do sistema, o CDI precisa conhece-lo. É esse o papel do @Produces.

  27. Clayton Passos

    11. jun, 2012

    Só encontrei uma dificuldade, quando trabalhamos com validações, seja no JSF seja junto aos EJBs, implementando as interfaces correspondentes, o @Inject não funciona.

    Até onde vai meu conhecimento, isto se deve ao fato da especificação considerar uma validação como sendo um POJO sem comportamento, logo não seria passiva de utilização de um @Inject ou @EJB.

    A alternativa é utilizar um lookup.

  28. Sérgio Lopes

    11. jun, 2012

    Oi Clayton!

    Use o Seam Faces que ele amarra essas coisas pra você! Você pode injetar em Validators, entre outras coisas.

    Abraços

  29. Flavio Cattapan

    14. jun, 2012

    Bom dia, Sérgio. Tudo bem ?
    Cara não consegui ver vantagem no seu exemplo em utilizar o EJB 3, acho que aumentou a complexidade sem maiores ganhos.
    Obrigado.

  30. Sérgio Lopes

    15. jun, 2012

    Oi Flavio,

    Só recomendo usar o EJB3 se realmente os ganhos forem visíveis. Se você quiser usar o gerenciamento de transações dele, a remotabilidade e os outros serviços do container, é legal saber que tudo isso se integra com o CDI.

    Mas você pode usar o CDI sozinho e num Servlet Container como o Tomcat. E ai voce implementa os servicos que precisar (pode fazer um Interceptor CDI por exemplo pra cuidar das transações independentemente do EJB).

    Abraços

  31. Ricardo Longa

    22. jun, 2012

    Estamos utilizando CDI (Weld) em um novo projeto e é show de bola.

  32. Gilmar M. dos Santos

    22. jun, 2012

    Muito bom o post parabéns!
    Tive a oportinidade de fazer todos os modulos relacionados com Java na caelum do Rio de Janeiro e adiquiri uma ótima experiência, em dois desses modulos me deparei com CDI e depois com spring, realmente ambos os frameworks são muitos bons.

    Parabéns!!!

  33. Pedro

    21. jul, 2012

    Gostaria de largar o Spring para utilizar uma ferramenta Java, mas o Spring gerencia minhas transacoes do Hibernate, e principalmente utilizo AspectJ no Spring, sera possivel utilizar o AspectJ com CDI?

  34. Rafael Nascimento

    17. ago, 2012

    olá, Sérgio!! Tenho uma grande dúvida sobre o CDI junto com o JSF 2:

    CDI não tem um @ViewScoped, e me parece que o seu equivalente seria o @ConversationScoped. Mas no meu projeto não consegui substituir um pelo outro porque @ConversationScoped deve ser iniciado e fechado explicitamente, ao contrário do @ViewScoped, que é destruído pelo container quando outra página é carregada.

    Nos exemplos que vi sobre o fechamento de um @ConversationScoped, um commandButton chama o metodo no respectivo bean que encerra a conversação. No entanto, geralmente um app JSF usa muitos compositions (a minha), como por exemplo uma barra de menus que pode chamar várias outras páginas e que tb pode aparecer em várias views. Assim, como eu poderia encerrar um atual @ConversationScoped e iniciar outro, uma vez que o composition é usuado por várias páginas ??

    eu vi tb que se iniciar uma conversation, sem fechar a outra ativa, ocorre “IllegalStateException”

    abraço

  35. Renan

    31. out, 2012

    Conhecendo mais a fundo o CDI, vi alguns funcionalidades (O lance dos eventos) que podem simplificar uma aplicação que tenho escrita com VRaptor…
    Sérgio Lopes, excelente post e apresentação com ideias para o VRaptor. =D

  36. Felipe

    07. nov, 2012

    Blz Galera !! Estou com um problema se alguem puder me ajudar , vou começar o curso FJ-26 e ja estou tentando me familiarizar com o conteudo .
    Fiz os passo-a-passo acima e continua me dandp esse erro aqui (Tomcat 7)

    GRAVE: Error configuring application listener of class org.jboss.weld.environment.servlet.Listener
    java.lang.ClassNotFoundException: org.jboss.weld.environment.servlet.Listener

    Se alguem puder ajuda ae!!!

  37. Sérgio Lopes

    07. nov, 2012

    Felipe, ClassNotFoundException é porque não ta achando a classe, o JAR do Weld nesse caso. Todos os JARs estao certinhos na pasta WEB-INF/lib?

  38. Thatiana

    08. nov, 2012

    Olá Sérgio,

    Saberia dizer se seria possível a configuração do CDI no Jboss 4.2?

  39. Guilherme

    21. nov, 2012

    Você já fez algo com o Seam 3 – Módulo de persistência?
    Referente ao gerenciamento de tranzações, como posso criar o ProdutorEntityManager em relação ao seu escopo e do BackingBean(Anotado com @Named e ViewScoped)?

    Obrigado, um abraço.
    Muito bom o post.

  40. Thiago Fonseca

    05. fev, 2013

    Sérgio, utilizando o JBoss 7, a injeção de classes públicas com um construtor público padrão não está funcionando, como você disse no post.

    Apenas quando acrescento anotações de EJB’s (Stateless, Singleton, etc…) para a classe, que a injeção ocorre.

    Para configurar o CDI, acrescentei o beans.xml ao WEB-INF e acrescentei a dependência:

    javax.enterprise
    cdi-api
    1.0-SP4
    provided

    O que fiz de errado para as classes publicas não estarem sendo injetadas?

  41. Alberto Souza

    05. fev, 2013

    Oi Thiago,

    Poderia ser mais claro em relação ao erro? Qual a exceptio que está acontecendo?

    Realmente não era para ter nenhum problema. Qualquer classe que exista dentro do seu projeto web, deveria ser candidata a injeção e receber objetos injetados.

    Abraço!,

    Alberto

  42. Felipe Gutierrez

    05. fev, 2013

    Pelo o que entendi , a duvida do Thiago aborda os seguintes tópicos:

    1 – É possível injetar uma classe , se esta não for anotada como um EJB (stateless, stateful ou Singleton ) ?

    No seu exemplo a classe ProdutoDAO não está anotada. Funciona deste jeito? Criei um exemplo e não funciona , não ocorre injeção. Somente se anoto ela como sendo um EJB.

  43. Alberto Souza

    05. fev, 2013

    Oi Felipe,

    Não existe essa restrição. Tudo que está no projeto que contém o beans.xml pode ser injetado e receber alguma coisa injetada. Não existe a necessidade de ser um ejb. O que acontece no seu projeto? NPE? Simplesmente nada é injetado?

  44. Thiago Fonseca

    06. fev, 2013

    Alberto, obrigado por responder.

    Quando tento injetar em uma classe sem anotações, nada é injetado e meu objeto permanece nulo.

    Quando tento injetar em um Webservice (JAX-WS) recebo o seguinte erro: “Caused by: java.lang.RuntimeException: JBAS016060: Não foi possível resolver o bean CDI para o ponto de injeção”

  45. Cassio Thadeu

    21. fev, 2013

    Estou enfretando problema em um projeto maven, não esta encontrando o BeanManager, o arquivo context.xml tem que ficar na seguinte estrutura:
    webapp/META-INF/context.xml
    ou em alguma outra?

  46. André

    20. mar, 2013

    Parabés pelo post, achei muito interessante a forma de injetar o EntityManager utilizando o weld. Seguindo a idéia do post resolvi criar um DaoFactory e um EntityManagerFactory para injetar as minhas DAOs e o meu EntityManager, porém, não estou conseguindo fazer o @Inject EntityManager funcionar dentro da minha classe DAO que também foi injetada. Tem como fazer desta forma ou preciso mudar a minha abordagem?

    Muito obrigado.

  47. Daniel

    07. mai, 2013

    Uma vez usando CDI da até preguiça de pensar no Spring..
    só tem um problema: qual framework MVC (action based) trabalha bem com CDI hoje em dia?

  48. Alberto Souza

    07. mai, 2013

    Oi Daniel,

    Estamos trabalhando na integração do VRaptor com ele :) .

    Abraço!

    Alberto

  49. Bruno

    17. mai, 2013

    Sergio, no VRaptor, como ele faz para ver as dependencias no construtor e injeta-las? Qual classe é responsável por isso?

Trackbacks/Pingbacks

  1. Trabalhe com Java EE e Spring juntos | blog.caelum.com.br - maio 31, 2012

    [...] fora de um servidor de aplicação. Poderiamos utilizar o Weld para nos fornecer injeção padrão JavaEE por meio do CDI, permitindo inclusive customizar a criação dos objetos. O uso do Spring, entretanto, torna mais [...]

  2. 10 razões para migrar sua aplicação para JSF 2 | blog.caelum.com.br - setembro 19, 2012

    [...] CDI é a especificação para Injeção de Dependência (JSR-299). Surgiu também com o JavaEE 6 e foi prontamente adotada pela comunidade, inclusive integrando com linguagens como Ruby (projeto TorqueBox). Já teve inclusive alguns estudos para identificar o desempenho de aplicações que usam a API e concluem como a implementação de referência Weld evoluiu e ainda tem a evoluir. Com a especificação conseguimos algumas manipulações bem avançadas como, por exemplo, injeção de dependência para objetos genéricos. [...]

  3. Diminua suas dependências com os eventos do CDI | blog.caelum.com.br - dezembro 17, 2012

    [...] falamos de CDI aqui no blog da Caelum, tanto numa introdução pra você começar a usar o CDI quanto em tópicos mais avançados. E recentemente até abordei o tema em uma palestra sobre CDI no [...]

  4. 10 posts da Caelum mais acessados de 2012 | blog.caelum.com.br - dezembro 26, 2012

    [...] Use CDI no seu próximo projeto JavaPor Sérgio Lopes, em 23/05 [...]

  5. Trabalhe com CDI extensions | blog.caelum.com.br - abril 2, 2013

    [...] inicial do VRaptor com CDI. Durante o desenvolvimento tivemos que usar bastante funcionalidades dessa poderosa especificação.  O desafio que tivemos foi o de manter a compatibilidade em relação ao construtor com [...]

  6. As Novidades do Eclipse Juno | Ramos da Informática - maio 7, 2013

    [...] aspectos operacionais da IDE. Por exemplo, os recursos do Eclipse agora usufruem do poder do CDI (Context and Dependency Injection) para serem injetados e executados. Isso apresenta uma performance melhor e um código mais limpo [...]

Deixar uma Resposta