1. O documento descreve o Contexts and Dependency Injection (CDI) da especificação JEE6, que gerencia o ciclo de vida e dependências entre beans. 2. Ele é habilitado criando um arquivo beans.xml e principais anotações como @Named, @Inject e @Interceptor são explicadas. 3. O CDI permite que classes produzam e consumam eventos com @Observes e interceptação de métodos com @Interceptor.
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).
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
6. CDI
@Named
Registra uma classe no container CDI.
Instâncias serão criadas para cada anotação
@Injected encontrada.
@Named
public class ClientService {
...
}
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;
}
}
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; }
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");
}
}
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.");
}
}
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");
}
}
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