SlideShare uma empresa Scribd logo
1 de 28
Baixar para ler offline
CDI
Contexts and Dependency Injection em
JEE6
José Naves Moura Neto - josenaves@gmail.com
http://josenaves.com - @josenaves
Código em https://github.com/josenaves/cdiDemo
CDI
O que é?



O que é?
Especificação do mecanismo que gerencia
ciclo de vida e dependências entre beans
(servlets, EJBs, POJOs, JSF Managed Beans).
Introduzido no JEE6 (JSR-299).
CDI
Habilitando



Para habilitar:
  Criar um arquivo beans.xml no diretório
  META-INF da aplicação.
CDI
Funcionamento

Como funciona:
1. Durante o deploy, se o servidor de
   aplicações encontrar o arquivo beans.xml,
   será criado um contexto CDI.
2. Todas as classes com anotações CDI
   (@Named - javax.inject.Named) serão
   registradas.
3. Estes beans serão instanciados e injetados
   de acordo com suas dependências
CDI
@Named




         javax.inject.Named
CDI
@Named


Registra uma classe no container CDI.
Instâncias serão criadas para cada anotação
@Injected encontrada.

@Named
public class ClientService {
   ...
}
CDI
@Inject




          javax.inject.Inject
CDI
@Inject

Assinala o container CDI a gerar novas
instâncias da classe anotada para injetar no
campo, construtor ou setter.

public class Client {
    @Inject private ClientService clientService;

    private Account accout;
    // public Client(@Inject Account account) { this.account = account; }

    public void setAccount(@Inject Account account) {
        this.account = account;
    }
}
CDI
@Qualifier




      javax.inject.Qualifier
CDI
@Qualifier

Anotação usada para criar uma anotações que
serão usadas para diferenciar um tipo de outro.
@Qualifier
public @interface PreferedDao{}

@PreferedDao
public class OracleDao implements Dao { ... }

public class MongoDao implements Dao { ... }



public class MyService { @PreferedDao @Injected private dao; }
CDI
@Alternative




   javax.enterprise.Alternative
CDI
@Alternative

Desabilita classes de serem injetadas e evita
problemas de ambiguidades durante o
deployment.

A classe a ser utilizada para injeção deve ser
marcada no arquivo beans.xml (tag
<alternatives>).
CDI
@PostConstruct




  javax.annotation.PostConstruct
CDI
@PostConstruct


Anota um método que será chamado pelo
container quando o bean for instanciado e
todas suas dependências forem injetadas.
public class ClientService {
    @PostConstruct private void init() {
         // abre conexão TCP com Mainframe
         logger.info("ClientService operacional");
    }
}
CDI
@PreDestroy




   javax.annotation.PreDestroy
CDI
@PreDestroy


Anota um método que será chamado pelo
container quando o bean estiver no ponto de
ser descartado.
public class ClientService {
    ...
    @PreDestroy private void destroy() {
         // fecha conexão TCP com Mainframe
         logger.info("ClientService desativado.");
    }
}
CDI
@Observes




 javax.enterprise.event.Observes
CDI
@Observes

POJOs agora podem produzir e consumir
eventos.

Definindo um evento
public class Auth {
  @Inject Event<Login> loginEvent;
  ...
  public void auth() {
    ...
    if (success) {
      loginEvent.fire(login);
    }
  }
}
CDI
@Observes



Tratando um evento
public class Monitor {
  ...
  public void onLogin( @Observes Login login) {
    // grava em arquivo de log o login bem sucedido
    logger.info("Usuario " + login.username + " entrou no sistema.");
  }
}
CDI
@Interceptor




   javax.interceptor.Interceptor
CDI
@Interceptor
JEE também traz suporte a Interceptors para
POJOs.

Para usar, é necessário criar uma anotação
com @InterceptorBinding.
@InterceptorBinding
@Target ({TYPE, METHOD}) @Retention(RUNTIME)
public @interface Log{
}



Dessa maneira, toda classe que tiver a
anotação @Log será interceptada.
CDI
@Interceptor


Depois, é necessário fazer a implementação do
interceptor propriamente dito.
@Interceptor
@Log
public class LogInterceptor {
     @AroundInvoke
     public Object logMethod(InvocationContext ctx) throws Exception {
         logger.info("Entrando no método:" + ctx.getMethod().getName());
         return ctx.proceed();
     }
}
CDI
@Interceptor

É necessário também habilitar o interceptor no
arquivo beans.xml.
<beans>
    <interceptors>
         <class>br.com.oi.interceptor.LogInterceptor</class>
    </interceptors>
</beans>


Podemos ter vários interceptors ativos no
projeto. A ordem em que os interceptors são
definidos é importante!
CDI
@Interceptor


Pronto! Agora toda classe que estiver anotada
com @Log, logará a chamada do método
automaticamente.

@Log
public class QueroLogar {
     public void metodo() {
         System.out.println("Teste");
     }
}
CDI
Principais anotações
Resumindo:
  @Named
  @Inject
  @Qualifier
  @Alternative
  @PostConstruct
  @PreDestroy
  @Observes
  @Interceptor
CDI
Recursos

● Java EE Managed Bean Specification
  http://jcp.org/en/jsr/detail?id=316

● Série de tutoriais JEE2 CDI de Andy Gibson
  no site do Netbeans
  http://netbeans.org/kb/docs/javaee/cdi-intro.html

● Weld - implementação de referência da
  especificação JSR-299
  http://sfwk.org/Weld
CDI
Livros
CDI
The End

Mais conteúdo relacionado

Destaque

Pornografia na internet: Come ela chega aos seus filhos e como evitá-la
Pornografia na internet: Come ela chega aos seus filhos e como evitá-laPornografia na internet: Come ela chega aos seus filhos e como evitá-la
Pornografia na internet: Come ela chega aos seus filhos e como evitá-laAvelino Ferreira Gomes Filho
 
Redes Sociais: Ameaças e Oportunidades, by Martha Gabriel
Redes Sociais: Ameaças e Oportunidades, by Martha GabrielRedes Sociais: Ameaças e Oportunidades, by Martha Gabriel
Redes Sociais: Ameaças e Oportunidades, by Martha GabrielMartha Gabriel
 
Cenário das Redes Sociais no Brasil 2017
Cenário das Redes Sociais no Brasil 2017Cenário das Redes Sociais no Brasil 2017
Cenário das Redes Sociais no Brasil 2017Renato Melo
 
Redes Sociais na Escola
Redes Sociais na Escola Redes Sociais na Escola
Redes Sociais na Escola SONIA BERTOCCHI
 

Destaque (7)

Pornografia na internet: Come ela chega aos seus filhos e como evitá-la
Pornografia na internet: Come ela chega aos seus filhos e como evitá-laPornografia na internet: Come ela chega aos seus filhos e como evitá-la
Pornografia na internet: Come ela chega aos seus filhos e como evitá-la
 
Redes Sociais: Ameaças e Oportunidades, by Martha Gabriel
Redes Sociais: Ameaças e Oportunidades, by Martha GabrielRedes Sociais: Ameaças e Oportunidades, by Martha Gabriel
Redes Sociais: Ameaças e Oportunidades, by Martha Gabriel
 
REDES SOCIAIS
REDES SOCIAISREDES SOCIAIS
REDES SOCIAIS
 
Redes sociais apresentação completa
Redes sociais   apresentação completaRedes sociais   apresentação completa
Redes sociais apresentação completa
 
Redes Sociais
Redes SociaisRedes Sociais
Redes Sociais
 
Cenário das Redes Sociais no Brasil 2017
Cenário das Redes Sociais no Brasil 2017Cenário das Redes Sociais no Brasil 2017
Cenário das Redes Sociais no Brasil 2017
 
Redes Sociais na Escola
Redes Sociais na Escola Redes Sociais na Escola
Redes Sociais na Escola
 

Semelhante a CDI em 40: Contextos e Injeção de Dependência

Sistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJBSistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJBAdriano Teixeira de Souza
 
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Adriano Teixeira de Souza
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeRafael Benevides
 
Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Erisvaldo Junior
 
CDI -Contextos e Dependências
CDI -Contextos e DependênciasCDI -Contextos e Dependências
CDI -Contextos e DependênciasWende Mendes
 
hibernate annotation
hibernate annotationhibernate annotation
hibernate annotationeduardo dias
 
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Elvis Rocha
 
Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Gilberto Holms
 
Aula05 android persistencia
Aula05 android persistenciaAula05 android persistencia
Aula05 android persistenciaRoberson Alves
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks phpIgor Moura
 
Aplicando CDI em aplicações Java
Aplicando CDI em aplicações JavaAplicando CDI em aplicações Java
Aplicando CDI em aplicações JavaMichel Graciano
 
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6Dr. Spock
 
Spring & Struts
Spring & StrutsSpring & Struts
Spring & Strutseduan
 
Seminário sd android_exemplos
Seminário sd android_exemplosSeminário sd android_exemplos
Seminário sd android_exemplosCalvin Rodrigues
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?Rafael Benevides
 
Introdução ao framework CodeIgniter
Introdução ao framework CodeIgniterIntrodução ao framework CodeIgniter
Introdução ao framework CodeIgniterAnderson Gonçalves
 

Semelhante a CDI em 40: Contextos e Injeção de Dependência (20)

Sistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJBSistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJB
 
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 
Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5
 
CDI -Contextos e Dependências
CDI -Contextos e DependênciasCDI -Contextos e Dependências
CDI -Contextos e Dependências
 
Tutorial struts
Tutorial strutsTutorial struts
Tutorial struts
 
hibernate annotation
hibernate annotationhibernate annotation
hibernate annotation
 
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
 
Workshop05
Workshop05Workshop05
Workshop05
 
Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5
 
Aula05 android persistencia
Aula05 android persistenciaAula05 android persistencia
Aula05 android persistencia
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks php
 
Aplicando CDI em aplicações Java
Aplicando CDI em aplicações JavaAplicando CDI em aplicações Java
Aplicando CDI em aplicações Java
 
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
 
Spring & Struts
Spring & StrutsSpring & Struts
Spring & Struts
 
Hibernate conceitos
Hibernate conceitosHibernate conceitos
Hibernate conceitos
 
Seminário sd android_exemplos
Seminário sd android_exemplosSeminário sd android_exemplos
Seminário sd android_exemplos
 
J530 14 xdoclet
J530 14 xdocletJ530 14 xdoclet
J530 14 xdoclet
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
 
Introdução ao framework CodeIgniter
Introdução ao framework CodeIgniterIntrodução ao framework CodeIgniter
Introdução ao framework CodeIgniter
 

Mais de Jose Naves Moura Neto

Iniciando no desenvolvimento android 2016
Iniciando no desenvolvimento android 2016Iniciando no desenvolvimento android 2016
Iniciando no desenvolvimento android 2016Jose Naves Moura Neto
 
Tutorial Android episódio 02 - Layout
Tutorial Android episódio 02 - LayoutTutorial Android episódio 02 - Layout
Tutorial Android episódio 02 - LayoutJose Naves Moura Neto
 
Preparando APKs para publicação na Google Play
Preparando APKs para publicação na Google PlayPreparando APKs para publicação na Google Play
Preparando APKs para publicação na Google PlayJose Naves Moura Neto
 
Como iniciar o desenvolvimento Android
Como iniciar o desenvolvimento AndroidComo iniciar o desenvolvimento Android
Como iniciar o desenvolvimento AndroidJose Naves Moura Neto
 
Tutorial AngularJS - episódio 9 - $http services
Tutorial AngularJS - episódio 9 - $http servicesTutorial AngularJS - episódio 9 - $http services
Tutorial AngularJS - episódio 9 - $http servicesJose Naves Moura Neto
 
Tutorial AngularJS - episódio 8 - serviços
Tutorial AngularJS - episódio 8 - serviçosTutorial AngularJS - episódio 8 - serviços
Tutorial AngularJS - episódio 8 - serviçosJose Naves Moura Neto
 
Tutorial AngularJS - episódio 2 - mvc
Tutorial AngularJS - episódio 2 -  mvcTutorial AngularJS - episódio 2 -  mvc
Tutorial AngularJS - episódio 2 - mvcJose Naves Moura Neto
 
Tutorial AngularJS - episódio 2 - Hello World
Tutorial AngularJS - episódio 2 -  Hello WorldTutorial AngularJS - episódio 2 -  Hello World
Tutorial AngularJS - episódio 2 - Hello WorldJose Naves Moura Neto
 
Tutorial AngularJS - episódio 1 - ambiente
Tutorial AngularJS - episódio 1 - ambienteTutorial AngularJS - episódio 1 - ambiente
Tutorial AngularJS - episódio 1 - ambienteJose Naves Moura Neto
 
Tutorial AngularJS - episódio 5 - diretivas
Tutorial AngularJS - episódio 5 -  diretivasTutorial AngularJS - episódio 5 -  diretivas
Tutorial AngularJS - episódio 5 - diretivasJose Naves Moura Neto
 
Tutorial AngularJS - Episódio 4 - Controllers
Tutorial AngularJS - Episódio 4 - ControllersTutorial AngularJS - Episódio 4 - Controllers
Tutorial AngularJS - Episódio 4 - ControllersJose Naves Moura Neto
 

Mais de Jose Naves Moura Neto (14)

Iniciando no desenvolvimento android 2016
Iniciando no desenvolvimento android 2016Iniciando no desenvolvimento android 2016
Iniciando no desenvolvimento android 2016
 
Tutorial Android episódio 02 - Layout
Tutorial Android episódio 02 - LayoutTutorial Android episódio 02 - Layout
Tutorial Android episódio 02 - Layout
 
Tutorial Android - Activities
Tutorial Android - ActivitiesTutorial Android - Activities
Tutorial Android - Activities
 
Preparando APKs para publicação na Google Play
Preparando APKs para publicação na Google PlayPreparando APKs para publicação na Google Play
Preparando APKs para publicação na Google Play
 
Como iniciar o desenvolvimento Android
Como iniciar o desenvolvimento AndroidComo iniciar o desenvolvimento Android
Como iniciar o desenvolvimento Android
 
Tutorial AngularJS - episódio 9 - $http services
Tutorial AngularJS - episódio 9 - $http servicesTutorial AngularJS - episódio 9 - $http services
Tutorial AngularJS - episódio 9 - $http services
 
Tutorial AngularJS - episódio 8 - serviços
Tutorial AngularJS - episódio 8 - serviçosTutorial AngularJS - episódio 8 - serviços
Tutorial AngularJS - episódio 8 - serviços
 
Tutorial AngularJS - episódio 2 - mvc
Tutorial AngularJS - episódio 2 -  mvcTutorial AngularJS - episódio 2 -  mvc
Tutorial AngularJS - episódio 2 - mvc
 
Tutorial AngularJS - episódio 2 - Hello World
Tutorial AngularJS - episódio 2 -  Hello WorldTutorial AngularJS - episódio 2 -  Hello World
Tutorial AngularJS - episódio 2 - Hello World
 
Tutorial AngularJS - episódio 1 - ambiente
Tutorial AngularJS - episódio 1 - ambienteTutorial AngularJS - episódio 1 - ambiente
Tutorial AngularJS - episódio 1 - ambiente
 
Tutorial AngularJS - episódio 5 - diretivas
Tutorial AngularJS - episódio 5 -  diretivasTutorial AngularJS - episódio 5 -  diretivas
Tutorial AngularJS - episódio 5 - diretivas
 
Tutorial AngularJS - Episódio 4 - Controllers
Tutorial AngularJS - Episódio 4 - ControllersTutorial AngularJS - Episódio 4 - Controllers
Tutorial AngularJS - Episódio 4 - Controllers
 
MEAN
MEANMEAN
MEAN
 
Programação reativa com Meteor
Programação reativa com MeteorProgramação reativa com Meteor
Programação reativa com Meteor
 

CDI em 40: Contextos e Injeção de Dependência

  • 1. CDI Contexts and Dependency Injection em JEE6 José Naves Moura Neto - josenaves@gmail.com http://josenaves.com - @josenaves Código em https://github.com/josenaves/cdiDemo
  • 2. CDI O que é? O que é? Especificação do mecanismo que gerencia ciclo de vida e dependências entre beans (servlets, EJBs, POJOs, JSF Managed Beans). Introduzido no JEE6 (JSR-299).
  • 3. CDI Habilitando Para habilitar: Criar um arquivo beans.xml no diretório META-INF da aplicação.
  • 4. CDI Funcionamento Como funciona: 1. Durante o deploy, se o servidor de aplicações encontrar o arquivo beans.xml, será criado um contexto CDI. 2. Todas as classes com anotações CDI (@Named - javax.inject.Named) serão registradas. 3. Estes beans serão instanciados e injetados de acordo com suas dependências
  • 5. CDI @Named javax.inject.Named
  • 6. CDI @Named Registra uma classe no container CDI. Instâncias serão criadas para cada anotação @Injected encontrada. @Named public class ClientService { ... }
  • 7. CDI @Inject javax.inject.Inject
  • 8. CDI @Inject Assinala o container CDI a gerar novas instâncias da classe anotada para injetar no campo, construtor ou setter. public class Client { @Inject private ClientService clientService; private Account accout; // public Client(@Inject Account account) { this.account = account; } public void setAccount(@Inject Account account) { this.account = account; } }
  • 9. CDI @Qualifier javax.inject.Qualifier
  • 10. CDI @Qualifier Anotação usada para criar uma anotações que serão usadas para diferenciar um tipo de outro. @Qualifier public @interface PreferedDao{} @PreferedDao public class OracleDao implements Dao { ... } public class MongoDao implements Dao { ... } public class MyService { @PreferedDao @Injected private dao; }
  • 11. CDI @Alternative javax.enterprise.Alternative
  • 12. CDI @Alternative Desabilita classes de serem injetadas e evita problemas de ambiguidades durante o deployment. A classe a ser utilizada para injeção deve ser marcada no arquivo beans.xml (tag <alternatives>).
  • 14. CDI @PostConstruct Anota um método que será chamado pelo container quando o bean for instanciado e todas suas dependências forem injetadas. public class ClientService { @PostConstruct private void init() { // abre conexão TCP com Mainframe logger.info("ClientService operacional"); } }
  • 15. CDI @PreDestroy javax.annotation.PreDestroy
  • 16. CDI @PreDestroy Anota um método que será chamado pelo container quando o bean estiver no ponto de ser descartado. public class ClientService { ... @PreDestroy private void destroy() { // fecha conexão TCP com Mainframe logger.info("ClientService desativado."); } }
  • 18. CDI @Observes POJOs agora podem produzir e consumir eventos. Definindo um evento public class Auth { @Inject Event<Login> loginEvent; ... public void auth() { ... if (success) { loginEvent.fire(login); } } }
  • 19. CDI @Observes Tratando um evento public class Monitor { ... public void onLogin( @Observes Login login) { // grava em arquivo de log o login bem sucedido logger.info("Usuario " + login.username + " entrou no sistema."); } }
  • 20. CDI @Interceptor javax.interceptor.Interceptor
  • 21. CDI @Interceptor JEE também traz suporte a Interceptors para POJOs. Para usar, é necessário criar uma anotação com @InterceptorBinding. @InterceptorBinding @Target ({TYPE, METHOD}) @Retention(RUNTIME) public @interface Log{ } Dessa maneira, toda classe que tiver a anotação @Log será interceptada.
  • 22. CDI @Interceptor Depois, é necessário fazer a implementação do interceptor propriamente dito. @Interceptor @Log public class LogInterceptor { @AroundInvoke public Object logMethod(InvocationContext ctx) throws Exception { logger.info("Entrando no método:" + ctx.getMethod().getName()); return ctx.proceed(); } }
  • 23. CDI @Interceptor É necessário também habilitar o interceptor no arquivo beans.xml. <beans> <interceptors> <class>br.com.oi.interceptor.LogInterceptor</class> </interceptors> </beans> Podemos ter vários interceptors ativos no projeto. A ordem em que os interceptors são definidos é importante!
  • 24. CDI @Interceptor Pronto! Agora toda classe que estiver anotada com @Log, logará a chamada do método automaticamente. @Log public class QueroLogar { public void metodo() { System.out.println("Teste"); } }
  • 25. CDI Principais anotações Resumindo: @Named @Inject @Qualifier @Alternative @PostConstruct @PreDestroy @Observes @Interceptor
  • 26. CDI Recursos ● Java EE Managed Bean Specification http://jcp.org/en/jsr/detail?id=316 ● Série de tutoriais JEE2 CDI de Andy Gibson no site do Netbeans http://netbeans.org/kb/docs/javaee/cdi-intro.html ● Weld - implementação de referência da especificação JSR-299 http://sfwk.org/Weld