[java] contexts and dependency injection em jee6
DESCRIPTION
Context and Dependecy Injection - CDI - uma introduçãoTRANSCRIPT
CDIContexts and Dependency Injection em JEE6José Naves Moura Neto - [email protected]://josenaves.com - @josenavesCódigo em https://github.com/josenaves/cdiDemo
CDIO 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).
CDIHabilitando
Para habilitar:Criar um arquivo beans.xml no diretório META-INF da aplicação.
CDIFuncionamento
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.
@Qualifierpublic @interface PreferedDao{}
@PreferedDaopublic 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 eventopublic 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@Logpublic class LogInterceptor {
@AroundInvokepublic 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.
@Logpublic class QueroLogar {
public void metodo() {
System.out.println("Teste");}
}
CDIPrincipais anotações
Resumindo:@Named@Inject@Qualifier@Alternative@PostConstruct@PreDestroy@Observes@Interceptor
CDIRecursos
● Java EE Managed Bean Specificationhttp://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-299http://sfwk.org/Weld
CDILivros
CDIThe End