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

[Java] Contexts and Dependency Injection em JEE6

  • 1.
    CDI Contexts and DependencyInjection 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 é? Oque é? 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. Duranteo 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 classeno 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 containerCDI 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 paracriar 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 deserem 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>).
  • 13.
  • 14.
    CDI @PostConstruct Anota um métodoque 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étodoque 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."); } }
  • 17.
  • 18.
    CDI @Observes POJOs agora podemproduzir 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 publicclass 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 trazsuporte 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áriofazer 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émhabilitar 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 todaclasse 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 EEManaged 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
  • 27.
  • 28.