[java] contexts and dependency injection em jee6
DESCRIPTION
Context and Dependecy Injection - CDI - uma introduçãoTRANSCRIPT
![Page 1: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/1.jpg)
CDIContexts and Dependency Injection em JEE6José Naves Moura Neto - [email protected]://josenaves.com - @josenavesCódigo em https://github.com/josenaves/cdiDemo
![Page 2: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/2.jpg)
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).
![Page 3: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/3.jpg)
CDIHabilitando
Para habilitar:Criar um arquivo beans.xml no diretório META-INF da aplicação.
![Page 4: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/4.jpg)
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
![Page 5: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/5.jpg)
CDI@Named
javax.inject.Named
![Page 6: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/6.jpg)
CDI@Named
Registra uma classe no container CDI. Instâncias serão criadas para cada anotação @Injected encontrada.
@Named
public class ClientService {
...
}
![Page 7: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/7.jpg)
CDI@Inject
javax.inject.Inject
![Page 8: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/8.jpg)
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;
}
}
![Page 9: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/9.jpg)
CDI@Qualifier
javax.inject.Qualifier
![Page 10: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/10.jpg)
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; }
![Page 11: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/11.jpg)
CDI@Alternative
javax.enterprise.Alternative
![Page 12: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/12.jpg)
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>).
![Page 13: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/13.jpg)
CDI@PostConstruct
javax.annotation.PostConstruct
![Page 14: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/14.jpg)
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");
}
}
![Page 15: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/15.jpg)
CDI@PreDestroy
javax.annotation.PreDestroy
![Page 16: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/16.jpg)
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.");
}
}
![Page 17: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/17.jpg)
CDI@Observes
javax.enterprise.event.Observes
![Page 18: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/18.jpg)
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); }
}
}
![Page 19: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/19.jpg)
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.");
}
}
![Page 20: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/20.jpg)
CDI@Interceptor
javax.interceptor.Interceptor
![Page 21: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/21.jpg)
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.
![Page 22: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/22.jpg)
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();
}
}
![Page 23: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/23.jpg)
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!
![Page 24: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/24.jpg)
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");}
}
![Page 25: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/25.jpg)
CDIPrincipais anotações
Resumindo:@Named@Inject@Qualifier@Alternative@PostConstruct@PreDestroy@Observes@Interceptor
![Page 26: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/26.jpg)
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
![Page 27: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/27.jpg)
CDILivros
![Page 28: [Java] Contexts and Dependency Injection em JEE6](https://reader034.vdocuments.site/reader034/viewer/2022052600/5579a532d8b42ac1148b4a46/html5/thumbnails/28.jpg)
CDIThe End