Palestra que explorou os recursos de extensibilidade da API de CDI (Contexts & Dependency Injection) do Java EE 6 e foi realizada no The Developers Conference 2012 em São Paulo para a trilha de Java EE.
Resumo: "Dentre todas as APIs que compõem a especificação da plataforma Java EE 6, a API de Contextos e Injeção de Dependência (Contexts and Dependency Injection), ou simplesmente CDI, é a grande novidade que não existia nas versões anteriores desta plataforma. Esta API adiciona um suporte ao conceito de "Injeção de Dependências" como uma ferramenta de modelagem. Contudo, esta API suporta um conjunto de pontos de extensão que permitem uma aplicação adicionar novas funcionalidades na plataforma ou mudar o comportamento padrão definido pela especificação. Esta apresentação irá explorar recursos de extensibilidade do CDI para um uso avançado ao criar componentes numa aplicação enterprise baseados em CDI beans integrados à plataforma."
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!
• 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
7. “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.”
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;
}
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