[Java] Contexts and Dependency Injection em JEE6

768
-1

Published on

Context and Dependecy Injection - CDI - uma introdução

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
768
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
22
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

[Java] Contexts and Dependency Injection em JEE6

  1. 1. CDIContexts and Dependency Injection emJEE6José Naves Moura Neto - josenaves@gmail.comhttp://josenaves.com - @josenavesCódigo em https://github.com/josenaves/cdiDemo
  2. 2. CDIO que é?O que é?Especificação do mecanismo que gerenciaciclo de vida e dependências entre beans(servlets, EJBs, POJOs, JSF Managed Beans).Introduzido no JEE6 (JSR-299).
  3. 3. CDIHabilitandoPara habilitar: Criar um arquivo beans.xml no diretório META-INF da aplicação.
  4. 4. CDIFuncionamentoComo 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
  5. 5. CDI@Named javax.inject.Named
  6. 6. CDI@NamedRegistra uma classe no container CDI.Instâncias serão criadas para cada anotação@Injected encontrada.@Namedpublic class ClientService { ...}
  7. 7. CDI@Inject javax.inject.Inject
  8. 8. CDI@InjectAssinala o container CDI a gerar novasinstâncias da classe anotada para injetar nocampo, 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; }}
  9. 9. CDI@Qualifier javax.inject.Qualifier
  10. 10. CDI@QualifierAnotação usada para criar uma anotações queserã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; }
  11. 11. CDI@Alternative javax.enterprise.Alternative
  12. 12. CDI@AlternativeDesabilita classes de serem injetadas e evitaproblemas de ambiguidades durante odeployment.A classe a ser utilizada para injeção deve sermarcada no arquivo beans.xml (tag<alternatives>).
  13. 13. CDI@PostConstruct javax.annotation.PostConstruct
  14. 14. CDI@PostConstructAnota um método que será chamado pelocontainer quando o bean for instanciado etodas suas dependências forem injetadas.public class ClientService { @PostConstruct private void init() { // abre conexão TCP com Mainframe logger.info("ClientService operacional"); }}
  15. 15. CDI@PreDestroy javax.annotation.PreDestroy
  16. 16. CDI@PreDestroyAnota um método que será chamado pelocontainer quando o bean estiver no ponto deser descartado.public class ClientService { ... @PreDestroy private void destroy() { // fecha conexão TCP com Mainframe logger.info("ClientService desativado."); }}
  17. 17. CDI@Observes javax.enterprise.event.Observes
  18. 18. CDI@ObservesPOJOs agora podem produzir e consumireventos.Definindo um eventopublic class Auth { @Inject Event<Login> loginEvent; ... public void auth() { ... if (success) { loginEvent.fire(login); } }}
  19. 19. CDI@ObservesTratando um eventopublic 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."); }}
  20. 20. CDI@Interceptor javax.interceptor.Interceptor
  21. 21. CDI@InterceptorJEE também traz suporte a Interceptors paraPOJOs.Para usar, é necessário criar uma anotaçãocom @InterceptorBinding.@InterceptorBinding@Target ({TYPE, METHOD}) @Retention(RUNTIME)public @interface Log{}Dessa maneira, toda classe que tiver aanotação @Log será interceptada.
  22. 22. CDI@InterceptorDepois, é necessário fazer a implementação dointerceptor propriamente dito.@Interceptor@Logpublic class LogInterceptor { @AroundInvoke public Object logMethod(InvocationContext ctx) throws Exception { logger.info("Entrando no método:" + ctx.getMethod().getName()); return ctx.proceed(); }}
  23. 23. CDI@InterceptorÉ necessário também habilitar o interceptor noarquivo beans.xml.<beans> <interceptors> <class>br.com.oi.interceptor.LogInterceptor</class> </interceptors></beans>Podemos ter vários interceptors ativos noprojeto. A ordem em que os interceptors sãodefinidos é importante!
  24. 24. CDI@InterceptorPronto! Agora toda classe que estiver anotadacom @Log, logará a chamada do métodoautomaticamente.@Logpublic class QueroLogar { public void metodo() { System.out.println("Teste"); }}
  25. 25. CDIPrincipais anotaçõesResumindo: @Named @Inject @Qualifier @Alternative @PostConstruct @PreDestroy @Observes @Interceptor
  26. 26. CDIRecursos● 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
  27. 27. CDILivros
  28. 28. CDIThe End

×