Contexts & Dependency
   Injection (CDI)
  Usando os recursos de extensibilidade da
          API de CDI do Java EE 6

                 Dr. Spock
                @drspockbr
@bout me!
• Bacharel e especialista em Física
  pela UFV e Unicamp;

• Desenvolvedor de aplicações
  Web desde 96 e Java desde 99;

• Palestrante nos principais
  eventos nacionais e
  internacionais;

• Integrante da equipe de
  desenvolvimento da Vocado LLC
Agenda

• Introdução

• Principais recursos

• CDI Portable Extensions

• Q&A
Introdução
O que é CDI?
“Contexts and Dependency Injection
(CDI) é a especificação da plataforma
 Java EE que adiciona os conceitos de
 injeção de dependência e contextos
aos componentes de negócios de uma
        aplicação corporativa.”
Características
• Type-safe;

• Orientado a anotações;

• Consistente;

• Portável;

• Turbina o modelo de
  componentes do Java EE.
Origens do CDI
Origens do CDI




JSR-299         JSR-330
Web Beans   Dependency Injection
                 for Java
Origens do CDI




          JSR-299                       JSR-330
Contexts and Dependency Injection   Dependency Injection
           for Java EE                   for Java
Origens do CDI




          JSR-299                       JSR-330
Contexts and Dependency Injection   Dependency Injection
           for Java EE                   for Java
Implementação
de Referência
CDI no Java EE 6
CDI no Java EE 6
Principais Recursos
Principais Recursos
• Managed Bean

• Injection

• Contexts

• Qualifiers

• Events

• Alternatives
Principais Recursos
• Specializations

• Stereotypes

• Interceptors

• Decorators

• Producers/Disposers

• Portable Extensions
  (SPI)
Development Time
       vs
    Runtime
Injeção de Dependência
       (Development Time)
                          @Inject
• @javax.inject.Inject    private ICaixaEletronico cxEletronico;


• Baseado no tipo do
  atributo ou parâmetro

• Injeta ocorrência única
  do tipo

• Instancia a partir do
  construtor sem
  parâmetros
Producers
            (Development Time)
                                         @Produces
 • Criação customizada de beans;         @BankRepository
                                         @PersistenceContext
                                         private EntityManager em;
 • Qualificador ajuda a ter
   múltiplos gerenciadores:              @Produces
                                         @BankRepository
   Ex.: @BankRepository                  @Resource
                                         private DataSource ds;


public class ProdutoDAO {          public class StoredProcedureBean {
  @Inject                            @Inject
  @BankRepository                    @BankRepository
  private EntityManager manager;     private DataSource ds;
}                                  }
Producers
        (Development Time)
                                    @Produces
• Criação customizada de beans;     @BankRepository
                                    @PersistenceContext
                                    private EntityManager em;
• Qualificador ajuda a ter
  múltiplos gerenciadores:          @Produces
                                    @BankRepository
  Ex.: @BankRepository              @Resource
                                    private DataSource ds;



      public void close(@Disposes EntityManager em) {
        em.close();
      }
Producers
                   (Runtime)
• Criação customizada de beans;

• Necessário um qualificador:
  Ex.: @Customizado @Inject
                          @Customizado
                          private ICaixaEletronico cxEletronico;

  @Producer
  @Customizado
  public ICaixaEletronico criarCaixaEletronicoCustomizado() {
    TDCBankCaixaEletronico e = new TDCBankCaixaEletronico(...);
    // customiza o caixa eletrônico
    return e;
  }
Producers
                   (Runtime)
• Criação customizada de objectos IStoredProcedure:
     @Inject
     @StoredProcedure(name = ”PROC_01”,
                      repository = @BankRepository)
     @Customizado
     private IStoredProcedure procedure;


  @Produces
  @Customizado
  public IStoredProcedure criarProcedure(InjectionPoint p) {
    // Obtem dados da anotação via objeto p.
    IStoredProcedure procedure = ... ;
    return procedure;
  }
Producers
                    (Runtime)
• Obtem EntityManager de acordo anotação;
      @Inject
      @StoredProcedure(name = ”PROC_01”,
                       repository = @BankRepository)
      @Customizado
      private IStoredProcedure procedure;

@Inject
@Any
private Instance<EntityManager> managerResolver;

public IStoredProcedure criarProcedure(InjectionPoint p) {
  // Obtem dados da anotação via objeto p.
  Annotation repositoryAnnotation = ... ;
  EntityManager em = managerResolver.select(repositoryAnnotation);
  IStoredProcedure procedure = ... ;
  return procedure;
}
Portable Extensions
       (SPI)
Portable Extentions (SPI)
• Funcionalidades para runtime;

• Permite registrar:

  • Beans customizados

  • Escopos customizados

  • Interceptors

  • Decorators

  • Stereotypes
Portable Extentions (SPI)
• Busca programática de
  beans;

• Injetar CDI beans em
  objetos próprios;

• Adicionar ou sobrescrever
  meta-anotações
Partes do SPI
Meta-Interfaces
• javax.enterprise.inject.spi   • Decorator<T>

• Extension                     • Producer<T>

• InjectionPoint                • ObserverMethod<T>

• Bean<T>                       • AnnotatedType<T>

• InjectionTarget<T>            • AnnotatedMethod<T>

• Interceptor<T>                • Instance<T>
SPI Events
• BeforeBeanDiscovery            • ProcessBean

• AfterBeanDiscovery             • ProcessObserverMethod

• BeforeShutdown                 • AfterDeploymentValidat
                                   ion
• ProcessAnnotatedType

• ProcessInjectionType   public void tratadorEvento(
                               @Observes BeforeShutdown event) {
                            // Lógica para processar evento.
• ProcessProducer        };
BeanManager
• Permite interagir diretamente com o CDI

    @Inject
    private BeanManager beanManager;
Criando um Extension
• Não é exatamente um CDI bean;

• Criado durante o
  processo de inicialização,
  antes de qualquer bean
  ou contexto existir; public     class MinhaExtensao
                                  implements Extension {
                             // tratadores de eventos SPI.
• Registrado em:        };

  META-INF/services/
  javax.enterprise.inject.spi.Extension
Exemplo de Extensões
Exemplo de Extensões




 http://openwebbeans.apache.org
Perguntas
Obrigado!
• Contato:
  Dr. Spock
  tdc2012@spock.com.br

• Twitter:
  @drspockbr

• About me:
  http://about.me/drspockbr

• Slides:
  http://slideshare.net/drspockbr

TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6

  • 1.
    Contexts & Dependency Injection (CDI) Usando os recursos de extensibilidade da API de CDI do Java EE 6 Dr. Spock @drspockbr
  • 2.
    @bout me! • Bacharele especialista em Física pela UFV e Unicamp; • Desenvolvedor de aplicações Web desde 96 e Java desde 99; • Palestrante nos principais eventos nacionais e internacionais; • Integrante da equipe de desenvolvimento da Vocado LLC
  • 4.
    Agenda • Introdução • Principaisrecursos • CDI Portable Extensions • Q&A
  • 5.
  • 6.
  • 7.
    “Contexts and DependencyInjection (CDI) é a especificação da plataforma Java EE que adiciona os conceitos de injeção de dependência e contextos aos componentes de negócios de uma aplicação corporativa.”
  • 8.
    Características • Type-safe; • Orientadoa anotações; • Consistente; • Portável; • Turbina o modelo de componentes do Java EE.
  • 9.
  • 10.
    Origens do CDI JSR-299 JSR-330 Web Beans Dependency Injection for Java
  • 11.
    Origens do CDI JSR-299 JSR-330 Contexts and Dependency Injection Dependency Injection for Java EE for Java
  • 12.
    Origens do CDI JSR-299 JSR-330 Contexts and Dependency Injection Dependency Injection for Java EE for Java
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
    Principais Recursos • ManagedBean • Injection • Contexts • Qualifiers • Events • Alternatives
  • 18.
    Principais Recursos • Specializations •Stereotypes • Interceptors • Decorators • Producers/Disposers • Portable Extensions (SPI)
  • 19.
  • 20.
    Injeção de Dependência (Development Time) @Inject • @javax.inject.Inject private ICaixaEletronico cxEletronico; • Baseado no tipo do atributo ou parâmetro • Injeta ocorrência única do tipo • Instancia a partir do construtor sem parâmetros
  • 21.
    Producers (Development Time) @Produces • Criação customizada de beans; @BankRepository @PersistenceContext private EntityManager em; • Qualificador ajuda a ter múltiplos gerenciadores: @Produces @BankRepository Ex.: @BankRepository @Resource private DataSource ds; public class ProdutoDAO { public class StoredProcedureBean { @Inject @Inject @BankRepository @BankRepository private EntityManager manager; private DataSource ds; } }
  • 22.
    Producers (Development Time) @Produces • Criação customizada de beans; @BankRepository @PersistenceContext private EntityManager em; • Qualificador ajuda a ter múltiplos gerenciadores: @Produces @BankRepository Ex.: @BankRepository @Resource private DataSource ds; public void close(@Disposes EntityManager em) { em.close(); }
  • 23.
    Producers (Runtime) • Criação customizada de beans; • Necessário um qualificador: Ex.: @Customizado @Inject @Customizado private ICaixaEletronico cxEletronico; @Producer @Customizado public ICaixaEletronico criarCaixaEletronicoCustomizado() { TDCBankCaixaEletronico e = new TDCBankCaixaEletronico(...); // customiza o caixa eletrônico return e; }
  • 24.
    Producers (Runtime) • Criação customizada de objectos IStoredProcedure: @Inject @StoredProcedure(name = ”PROC_01”, repository = @BankRepository) @Customizado private IStoredProcedure procedure; @Produces @Customizado public IStoredProcedure criarProcedure(InjectionPoint p) { // Obtem dados da anotação via objeto p. IStoredProcedure procedure = ... ; return procedure; }
  • 25.
    Producers (Runtime) • Obtem EntityManager de acordo anotação; @Inject @StoredProcedure(name = ”PROC_01”, repository = @BankRepository) @Customizado private IStoredProcedure procedure; @Inject @Any private Instance<EntityManager> managerResolver; public IStoredProcedure criarProcedure(InjectionPoint p) { // Obtem dados da anotação via objeto p. Annotation repositoryAnnotation = ... ; EntityManager em = managerResolver.select(repositoryAnnotation); IStoredProcedure procedure = ... ; return procedure; }
  • 26.
  • 27.
    Portable Extentions (SPI) •Funcionalidades para runtime; • Permite registrar: • Beans customizados • Escopos customizados • Interceptors • Decorators • Stereotypes
  • 28.
    Portable Extentions (SPI) •Busca programática de beans; • Injetar CDI beans em objetos próprios; • Adicionar ou sobrescrever meta-anotações
  • 29.
  • 30.
    Meta-Interfaces • javax.enterprise.inject.spi • Decorator<T> • Extension • Producer<T> • InjectionPoint • ObserverMethod<T> • Bean<T> • AnnotatedType<T> • InjectionTarget<T> • AnnotatedMethod<T> • Interceptor<T> • Instance<T>
  • 31.
    SPI Events • BeforeBeanDiscovery • ProcessBean • AfterBeanDiscovery • ProcessObserverMethod • BeforeShutdown • AfterDeploymentValidat ion • ProcessAnnotatedType • ProcessInjectionType public void tratadorEvento( @Observes BeforeShutdown event) { // Lógica para processar evento. • ProcessProducer };
  • 32.
    BeanManager • Permite interagirdiretamente com o CDI @Inject private BeanManager beanManager;
  • 33.
    Criando um Extension •Não é exatamente um CDI bean; • Criado durante o processo de inicialização, antes de qualquer bean ou contexto existir; public class MinhaExtensao implements Extension { // tratadores de eventos SPI. • Registrado em: }; META-INF/services/ javax.enterprise.inject.spi.Extension
  • 34.
  • 35.
    Exemplo de Extensões http://openwebbeans.apache.org
  • 36.
  • 37.
    Obrigado! • Contato: Dr. Spock tdc2012@spock.com.br • Twitter: @drspockbr • About me: http://about.me/drspockbr • Slides: http://slideshare.net/drspockbr