Conhecendo CDI
CDI 1.1 - JSR 346
Daniel Cunha (soro)
danielsoro@gmail.com
http://www.danielsoro.com.br
Daniel Cunha

soro - irc.freenode.net
http://danielsoro.com.br
http://github.com/danielsoro
http://twitter.com/dvlc_
danie...
O que é e pra que
serve o CDI?
Iniciando com CDI
beans.xml
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:sche...
Injetando suas
dependências
@
Inject
E quando eu tenho
mais de uma
implementação?
Qualifiers
Alternatives
Alternatives
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:s...
@
Priority
Interceptor.Priority.PLATFORM_BEFORE = 0
Interceptor.Priority.LIBRARY_BEFORE = 1000
Interceptor.Priority.APPLICAT...
E quando eu quiser
dar nome ao meu
bean?
@Inject @Named("user.name")
private String userName;
E quando eu quiser
evoluir o meu bean?
@Specializes
public class ClasseFilha extends ClasseMae
{}
@Specializes @Cejug
public class ClasseFilha extends ClasseMae
{}
@RequestScope @Ivia @Named(“mae”)
public class ClasseMae
@Specializes @Cejug
public class ClasseFilha extends ClasseMae
{}
@RequestScope @Ivia @Named(“mae”)
public class ClasseMae
@Specializes @Cejug @Named(“filha”)
public class ClasseFilha exte...
Tenho outra forma de
evitar ambiguidade?
@Typed({Cejug.class,GUJavaSC.class})
public class BrazilJugs extends Jugs
{}
E quando eu quiser
injetar uma classe
que não é um bean
CDI?
import javax.enterprise.inject.Produces;
public class Produtor {
@Produces
public Logger criarLogger(){
return LoggerFacto...
E quando eu quiser
finalizar esse bean?
import javax.enterprise.inject.Disposes;
public class Produtor {
@Produces @CejugDB
public EntityManager criaEntityManager...
Criações mais
flexiveis
import javax.enterprise.inject.Produces;
public class Produtor {
@Produces
public Logger criarLogger(InjectPoint injectPoi...
Escopos CDI
@RequestScoped
@SessionScoped
@ApplicationScoped
@ConversationScoped
@Dependent
Quero
interceptar..
Como eu faço?
@Interceptor @Priority(Interceptor.Priority.
APPLICATION)
public class Auditor {}
Posso escolher
quem interceptar?
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@InterceptorBinding
public @interface ...
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Inherited
@InterceptorBinding
public ...
Interceptando o
ciclo de vida
@AroundConstruct
@PostConstruct
@PreDestroy
Decorando o
nosso bean
@Decorator
public abstract class CoderDecorator implements Coder
{
@Inject
@Delegate
@Any
Coder coder;
public String codeS...
Decorator
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:sche...
Preciso replicar as 30
annotation da classe
X na Y… e agora?
@Stereotype
import javax.enterprise.inject.Stereotype;
@Stereotype
@Named @RequestScoped
@Auditavel @Rastreavel
@Retention(RetentionPo...
Diminuindo
acoplamento
@Inject
private Event<Palestrante> eventoCejug;
eventoCejug.fire(palestrante);
public void adicionarPalestrante(@Observes
Palestrante palestrante){}
E eu posso fazer
chamadas
assíncronas?
@Asynchronous
public void adicionarPalestrante(@Observes
Palestrante palestrante){}
Dúvidas?
Obrigado
Conhecendo CDI
CDI 1.1 - JSR 346
Daniel Cunha (soro)
danielsoro@gmail.com
http://www.danielsoro.com.br
Conhecendo CDI
Upcoming SlideShare
Loading in...5
×

Conhecendo CDI

916

Published on

Published in: Technology, Self Improvement
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
916
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
34
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Conhecendo CDI

  1. 1. Conhecendo CDI CDI 1.1 - JSR 346 Daniel Cunha (soro) danielsoro@gmail.com http://www.danielsoro.com.br
  2. 2. Daniel Cunha soro - irc.freenode.net http://danielsoro.com.br http://github.com/danielsoro http://twitter.com/dvlc_ danielsoro@gmail.com
  3. 3. O que é e pra que serve o CDI?
  4. 4. Iniciando com CDI
  5. 5. beans.xml <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http: //xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" version="1.1" bean-discovery-mode="all"> </beans>
  6. 6. Injetando suas dependências
  7. 7. @
  8. 8. Inject
  9. 9. E quando eu tenho mais de uma implementação?
  10. 10. Qualifiers
  11. 11. Alternatives
  12. 12. Alternatives <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http: //xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" version="1.1" bean-discovery-mode="all"> <alternatives> <class>package.RelaxedItemValdidator</class> </alternatives> </beans>
  13. 13. @
  14. 14. Priority Interceptor.Priority.PLATFORM_BEFORE = 0 Interceptor.Priority.LIBRARY_BEFORE = 1000 Interceptor.Priority.APPLICATION = 2000 Interceptor.Priority.LIBRARY_AFTER = 3000 Interceptor.Priority.PLATFORM_AFTER = 4000
  15. 15. E quando eu quiser dar nome ao meu bean?
  16. 16. @Inject @Named("user.name") private String userName;
  17. 17. E quando eu quiser evoluir o meu bean?
  18. 18. @Specializes public class ClasseFilha extends ClasseMae {}
  19. 19. @Specializes @Cejug public class ClasseFilha extends ClasseMae {}
  20. 20. @RequestScope @Ivia @Named(“mae”) public class ClasseMae @Specializes @Cejug public class ClasseFilha extends ClasseMae {}
  21. 21. @RequestScope @Ivia @Named(“mae”) public class ClasseMae @Specializes @Cejug @Named(“filha”) public class ClasseFilha extends ClasseMae {}
  22. 22. Tenho outra forma de evitar ambiguidade?
  23. 23. @Typed({Cejug.class,GUJavaSC.class}) public class BrazilJugs extends Jugs {}
  24. 24. E quando eu quiser injetar uma classe que não é um bean CDI?
  25. 25. import javax.enterprise.inject.Produces; public class Produtor { @Produces public Logger criarLogger(){ return LoggerFactory.getLogger(ConhecendoCDI.class); } }
  26. 26. E quando eu quiser finalizar esse bean?
  27. 27. import javax.enterprise.inject.Disposes; public class Produtor { @Produces @CejugDB public EntityManager criaEntityManager(){ EntityManagerFactory emf = Persistence. createEntityManagerFactory("cejugdb"); return emf.createEntityManager(); } public void fechaEntityManager(@Dispose @CejugDB EntityManager em){ em.close(); } }
  28. 28. Criações mais flexiveis
  29. 29. import javax.enterprise.inject.Produces; public class Produtor { @Produces public Logger criarLogger(InjectPoint injectPoint){ return LoggerFactory.getLogger(injectPoint.getMember() .getDeclaringClass().getName()); } }
  30. 30. Escopos CDI
  31. 31. @RequestScoped @SessionScoped @ApplicationScoped @ConversationScoped @Dependent
  32. 32. Quero interceptar.. Como eu faço?
  33. 33. @Interceptor @Priority(Interceptor.Priority. APPLICATION) public class Auditor {}
  34. 34. Posso escolher quem interceptar?
  35. 35. @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) @InterceptorBinding public @interface Auditavel {}
  36. 36. @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) @Inherited @InterceptorBinding public @interface Auditavel {}
  37. 37. Interceptando o ciclo de vida
  38. 38. @AroundConstruct @PostConstruct @PreDestroy
  39. 39. Decorando o nosso bean
  40. 40. @Decorator public abstract class CoderDecorator implements Coder { @Inject @Delegate @Any Coder coder; public String codeString(String s, int tval) { int len = s.length(); return coder.codeString(s, tval); } }
  41. 41. Decorator <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http: //xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" version="1.1" bean-discovery-mode="all"> <decorators> <class>decorators.CoderDecorator</class> </decorators> </beans>
  42. 42. Preciso replicar as 30 annotation da classe X na Y… e agora?
  43. 43. @Stereotype
  44. 44. import javax.enterprise.inject.Stereotype; @Stereotype @Named @RequestScoped @Auditavel @Rastreavel @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface CejugStereotype { }
  45. 45. Diminuindo acoplamento
  46. 46. @Inject private Event<Palestrante> eventoCejug;
  47. 47. eventoCejug.fire(palestrante);
  48. 48. public void adicionarPalestrante(@Observes Palestrante palestrante){}
  49. 49. E eu posso fazer chamadas assíncronas?
  50. 50. @Asynchronous public void adicionarPalestrante(@Observes Palestrante palestrante){}
  51. 51. Dúvidas?
  52. 52. Obrigado
  53. 53. Conhecendo CDI CDI 1.1 - JSR 346 Daniel Cunha (soro) danielsoro@gmail.com http://www.danielsoro.com.br
  1. ¿Le ha llamado la atención una diapositiva en particular?

    Recortar diapositivas es una manera útil de recopilar información importante para consultarla más tarde.

×