Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérgio Lopes

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Chargement dans…3
×

Consultez-les par la suite

1 sur 118 Publicité

Plus De Contenu Connexe

Diaporamas pour vous (15)

Publicité

Similaire à Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérgio Lopes (20)

Plus par Caelum (20)

Publicité

Plus récents (20)

Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérgio Lopes

  1. 1. CDI Porque você deveria usar CDI em todos os seus projetos Java
  2. 2. sergiolopes.org @sergio_caelum
  3. 3. CDI
  4. 4. (
  5. 5. CDI
  6. 6. CDI
  7. 7. CDI
  8. 8. public class ProdutoDao { public void salvar(Produto produto) { entityManager.persist(produto); } }
  9. 9. public class ProdutoDao { public void salvar(Produto produto) { EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa"); EntityManager entityManager = factory.createEntityManager(); entityManager.persist(produto); } }
  10. 10. CDI
  11. 11. public class ProdutoDao { public void salvar(Produto produto) { entityManager.persist(produto); } }
  12. 12. public class ProdutoDao { private EntityManager entityManager; public ProdutoDao(EntityManager em) { this.entityManager = em; } public void salvar(Produto produto) { entityManager.persist(produto); } }
  13. 13. public class ProdutoDao { private EntityManager entityManager; // recebo dependência pronta public ProdutoDao(EntityManager em) { this.entityManager = em; } // uso dependência public void salvar(Produto produto) { entityManager.persist(produto); } }
  14. 14. injeção de dependências!
  15. 15. inversão de controle. injeção de dependências!
  16. 16. separação de responsabilidades. inversão de controle. injeção de dependências!
  17. 17. )
  18. 18. CDI
  19. 19. especificação cdi implementação weld
  20. 20. public class ProdutoDao { private EntityManager entityManager; public ProdutoDao(EntityManager em) { this.entityManager = em; } public void salvar(Produto produto) { entityManager.persist(produto); } }
  21. 21. public class ProdutoDao { private EntityManager entityManager; @Inject public ProdutoDao(EntityManager em) { this.entityManager = em; } public void salvar(Produto produto) { entityManager.persist(produto); } }
  22. 22. public class ProdutoDao { @Inject private EntityManager entityManager; public void salvar(Produto produto) { entityManager.persist(produto); } }
  23. 23. CDI injeção com @Inject
  24. 24. public class ProdutoController { private ProdutoDao dao; public void insere() { Produto produto = // pega dados no request dao.salvar(produto); } }
  25. 25. public class ProdutoController { @Inject private ProdutoDao dao; public void insere() { Produto produto = // pega dados no request dao.salvar(produto); } }
  26. 26. injeção fácil!
  27. 27. eo EntityManager?
  28. 28. CDI métodos produtores
  29. 29. public class JPAUtil { public EntityManager criaEM() { } }
  30. 30. public class JPAUtil { public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); } }
  31. 31. public class JPAUtil { public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); } }
  32. 32. public class JPAUtil { @Produces public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); } }
  33. 33. quando criar o EntityManager?
  34. 34. public class JPAUtil { @Produces @RequestScoped public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); } }
  35. 35. mas e a factory?
  36. 36. public class JPAUtil { @Produces @RequestScoped public EntityManager criaEM(){ return factory.createEntityManager(); } }
  37. 37. public class JPAUtil { @Produces public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(){ return factory.createEntityManager(); } }
  38. 38. public class JPAUtil { @Produces public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(){ return factory.createEntityManager(); } }
  39. 39. public class JPAUtil { @Produces public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(EntityManagerFactory factory){ return factory.createEntityManager(); } }
  40. 40. public class JPAUtil { @Produces @ApplicationScoped public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(EntityManagerFactory factory){ return factory.createEntityManager(); } }
  41. 41. e quem fecha?
  42. 42. public class JPAUtil { public void fechaEM(EntityManager em) { em.close(); } }
  43. 43. public class JPAUtil { public void fechaEM(@Disposes EntityManager em) { em.close(); } }
  44. 44. gerenciamento do ciclo de vida!
  45. 45. e mais de um banco de dados?
  46. 46. public class JPAUtil { @Produces @ApplicationScoped public EntityManagerFactory criaFactory1() {} @Produces @RequestScoped public EntityManager criaEM1(EntityManagerFactory factory){} }
  47. 47. public class JPAUtil { @Produces @ApplicationScoped public EntityManagerFactory criaFactory1() {} @Produces @RequestScoped public EntityManager criaEM1(EntityManagerFactory factory){} @Produces @ApplicationScoped public EntityManagerFactory criaFactory2() {} @Produces @RequestScoped public EntityManager criaEM2(EntityManagerFactory factory){} }
  48. 48. public class JPAUtil { @Produces @ApplicationScoped public EntityManagerFactory criaFactory1() {} @Produces @RequestScoped public EntityManager criaEM1(EntityManagerFactory factory){} @Produces @ApplicationScoped public EntityManagerFactory criaFactory2() {} @Produces @RequestScoped ? public EntityManager criaEM2(EntityManagerFactory factory){} }
  49. 49. CDI qualifiers
  50. 50. public class JPAUtil { @Produces @ApplicationScoped @Geral public EntityManagerFactory criaFactory1() {} @Produces @RequestScoped public EntityManager criaEM1(EntityManagerFactory factory){} @Produces @ApplicationScoped @Diretor public EntityManagerFactory criaFactory2() {} @Produces @RequestScoped public EntityManager criaEM2(EntityManagerFactory factory){} }
  51. 51. public class JPAUtil { @Produces @ApplicationScoped @Geral public EntityManagerFactory criaFactory1() {} @Produces @RequestScoped public EntityManager criaEM1(@Geral EntityManagerFactory f){ @Produces @ApplicationScoped @Diretor public EntityManagerFactory criaFactory2() {} @Produces @RequestScoped public EntityManager criaEM2(@Diretor EntityManagerFactory f }
  52. 52. @Retention(RUNTIME) public @interface Diretor {} @Retention(RUNTIME) public @interface Geral {}
  53. 53. @Qualifier @Retention(RUNTIME) public @interface Diretor {} @Qualifier @Retention(RUNTIME) public @interface Geral {}
  54. 54. public class ProdutoDao { @Inject private EntityManager entityManager; public void salvar(Produto produto) { entityManager.persist(produto); } }
  55. 55. public class ProdutoDao { @Inject @Geral private EntityManager entityManager; public void salvar(Produto produto) { entityManager.persist(produto); } }
  56. 56. public class JPAUtil { @Produces @ApplicationScoped @Geral public EntityManagerFactory criaFactory1() {} @Produces @RequestScoped @Geral public EntityManager criaEM1(@Geral EntityManagerFactory f){ @Produces @ApplicationScoped @Diretor public EntityManagerFactory criaFactory2() {} @Produces @RequestScoped @Diretor public EntityManager criaEM2(@Diretor EntityManagerFactory f }
  57. 57. public class BackupDeTudo { public void backupBDs() { } }
  58. 58. public class BackupDeTudo { @Inject @Any private Instance<EntityManager> todosEntityMangers; public void backupBDs() { } }
  59. 59. public class BackupDeTudo { @Inject @Any private Instance<EntityManager> todosEntityMangers; public void backupBDs() { for (EntityManager em : todosEntityMangers) { // ... } } }
  60. 60. múltiplos beans!
  61. 61. quem controla transações?
  62. 62. public class ProdutoDao { @Inject private EntityManager entityManager; public void salvar(Produto produto) { entityManager.getTransaction().begin(); entityManager.persist(produto); entityManager.getTransaction().commit(); }
  63. 63. public class ProdutoDao { @Inject private EntityManager entityManager; public void salvar(Produto produto) { entityManager.getTransaction().begin(); entityManager.persist(produto); entityManager.getTransaction().commit(); } public void apagar(Produto produto) { entityManager.getTransaction().begin(); entityManager.remove(produto); entityManager.getTransaction().commit(); }
  64. 64. public class ProdutoDao { @Inject private EntityManager entityManager; public void salvar(Produto produto) { entityManager.getTransaction().begin(); entityManager.persist(produto); entityManager.getTransaction().commit(); } public void apagar(Produto produto) { entityManager.getTransaction().begin(); entityManager.remove(produto); entityManager.getTransaction().commit(); }
  65. 65. public class ProdutoController { @Inject private ProdutoDao dao; public void substitui() { dao.salvar(produtoNovo); dao.apagar(produtoAntigo); } }
  66. 66. CDI interceptadores
  67. 67. public class ProdutoController { @Inject private ProdutoDao dao; @Transacional public void substitui() { dao.salvar(produtoNovo); dao.apagar(produtoAntigo); } }
  68. 68. @InterceptorBinding @Retention(RUNTIME) public @interface Transacional { }
  69. 69. public class ProdutoDao { @Inject private EntityManager entityManager; public void salvar(Produto produto) { entityManager.persist(produto); } public void apagar(Produto produto) { entityManager.remove(produto); } }
  70. 70. @Interceptor @Transacional public class TransacionalInterceptor { }
  71. 71. @Interceptor @Transacional public class TransacionalInterceptor { @AroundInvoke public Object intercept(InvocationContext ctx) { } }
  72. 72. @Interceptor @Transacional public class TransacionalInterceptor { @AroundInvoke public Object intercept(InvocationContext ctx) { // ... antes da lógica Object resultado = ctx.proceed(); // ... depois da lógica return resultado; } }
  73. 73. @Interceptor @Transacional public class TransacionalInterceptor { @Inject private EntityManager em; @AroundInvoke public Object intercept(InvocationContext ctx) { em.getTransaction().begin(); Object resultado = ctx.proceed(); em.getTransaction().commit(); return resultado; } }
  74. 74. <beans> <interceptors> <class> br.com.caelum.TransacionalInterceptor </class> </interceptors> </beans>
  75. 75. mais encapsulado!
  76. 76. um processo de compra complexo
  77. 77. public class Pagamento { public void efetuaCobranca() { // ... comunica com Cielo } }
  78. 78. public class Estoque { public void reservaMercadoria() { // ... reserva produto no estoque } }
  79. 79. public class Notificacoes { public void notificaCompra() { // envia email confirmando pro usuario } }
  80. 80. public class FinalizaCompraController { public void finalizaCompra() { } }
  81. 81. public class FinalizaCompraController { @Inject private Pagamento pagamento; public void finalizaCompra() { pagamento.efetuaCobranca(); } }
  82. 82. public class FinalizaCompraController { @Inject private Pagamento pagamento; @Inject private Estoque estoque; public void finalizaCompra() { pagamento.efetuaCobranca(); estoque.reservaMercadoria(); } }
  83. 83. public class FinalizaCompraController { @Inject private Pagamento pagamento; @Inject private Estoque estoque; @Inject private Notificacoes notificacoes; public void finalizaCompra() { pagamento.efetuaCobranca(); estoque.reservaMercadoria(); notificacoes.notificaCompra(); } }
  84. 84. como desacoplar o processo?
  85. 85. CDI eventos
  86. 86. public class FinalizaCompraController { public void finalizaCompra() { } }
  87. 87. public class FinalizaCompraController { public void finalizaCompra() { Compra compra = new Compra(produto, cliente); } }
  88. 88. public class FinalizaCompraController { @Inject @Any private Event<Compra> eventoCompra; public void finalizaCompra() { Compra compra = new Compra(produto, cliente); } }
  89. 89. public class FinalizaCompraController { @Inject @Any private Event<Compra> eventoCompra; public void finalizaCompra() { Compra compra = new Compra(produto, cliente); eventoCompra.fire(compra); } }
  90. 90. public class Pagamento { public void efetuaCobranca(Compra c) { // ... comunica com Cielo } }
  91. 91. public class Pagamento { public void efetuaCobranca(@Observes Compra c) { // ... comunica com Cielo } }
  92. 92. public class Pagamento { public void efetuaCobranca(@Observes Compra c) { // ... comunica com Cielo } } public class Estoque { public void reservaMercadoria(@Observes Compra c) // ... reserva produto no estoque } }
  93. 93. mais desacoplado!
  94. 94. não quero cobrar o cartão em teste
  95. 95. public class Pagamento { public void efetuaCobranca(@Observes Compra c) { WebServiceCielo.cobraDeVerdade(c.getCartao()); } }
  96. 96. CDI alternatives
  97. 97. public class PagamentoDeVerdade { } public class PagamentoDeMentira { }
  98. 98. public class PagamentoDeVerdade { public void efetuaCobranca(@Observes Compra c) { } } public class PagamentoDeMentira { public void efetuaCobranca(@Observes Compra c) { } }
  99. 99. public class PagamentoDeVerdade { public void efetuaCobranca(@Observes Compra c) { WebServiceCielo.cobraDeVerdade(c.getCartao()); } } public class PagamentoDeMentira { public void efetuaCobranca(@Observes Compra c) { LogDeTeste.fariaUmaCompraAqui(); } }
  100. 100. public class PagamentoDeVerdade implements Pagamento { public void efetuaCobranca(@Observes Compra c) { WebServiceCielo.cobraDeVerdade(c.getCartao()); } } public class PagamentoDeMentira implements Pagamento { public void efetuaCobranca(@Observes Compra c) { LogDeTeste.fariaUmaCompraAqui(); } }
  101. 101. public class PagamentoDeVerdade implements Pagamento { public void efetuaCobranca(@Observes Compra c) { WebServiceCielo.cobraDeVerdade(c.getCartao()); } } @Alternative public class PagamentoDeMentira implements Pagamento { public void efetuaCobranca(@Observes Compra c) { LogDeTeste.fariaUmaCompraAqui(); } }
  102. 102. <beans> <alternatives> <class> br.com.caelum.PagamentoDeMentira </class> </alternatives> </beans>
  103. 103. CDI extensions spi
  104. 104. posso estender o próprio CDI!
  105. 105. public class HelloExtension implements Extension { }
  106. 106. public class HelloExtension implements Extension { <T> void hiBean(@Observes ProcessAnnotatedType<T> pat) { } }
  107. 107. public class HelloExtension implements Extension { <T> void hiBean(@Observes ProcessAnnotatedType<T> pat) { Class<T> clazz = pat.getAnnotatedType().getJavaClass(); System.out.println("Hi! " + clazz.getName()); } }
  108. 108. META-INF/services/javax.enterprise.inject.spi.Extension br.com.caelum.HelloExtension
  109. 109. posso modificar os beans do CDI
  110. 110. public class ModulosOpcionaisExtension implements Extension{ }
  111. 111. public class ModulosOpcionaisExtension implements Extension{ <T> void bloqueia(@Observes ProcessAnnotatedType<T> pat) { } }
  112. 112. public class ModulosOpcionaisExtension implements Extension{ <T> void bloqueia(@Observes ProcessAnnotatedType<T> pat) { Class<T> clazz = pat.getAnnotatedType().getJavaClass(); String packageName = clazz.getPackage().getName(); } }
  113. 113. public class ModulosOpcionaisExtension implements Extension{ <T> void bloqueia(@Observes ProcessAnnotatedType<T> pat) { Class<T> clazz = pat.getAnnotatedType().getJavaClass(); String packageName = clazz.getPackage().getName(); if (deveSerBloqueado(packageName)) { } } private boolean deveSerBloqueado(String pkg) { // TODO ler um arquivo de config de módulos bloqueados? return pkg.startsWith("br.com.caelum.entrega"); } }
  114. 114. public class ModulosOpcionaisExtension implements Extension{ <T> void bloqueia(@Observes ProcessAnnotatedType<T> pat) { Class<T> clazz = pat.getAnnotatedType().getJavaClass(); String packageName = clazz.getPackage().getName(); if (deveSerBloqueado(packageName)) { pat.veto(); } } private boolean deveSerBloqueado(String pkg) { // TODO ler um arquivo de config de módulos bloqueados? return pkg.startsWith("br.com.caelum.entrega"); } }
  115. 115. dá pra estender muito mais
  116. 116. decorators stereotypes + injection points custom scopes CDI conversation scope mais de extensions
  117. 117. CDI Você deveria usar CDI em todos os seus projetos Java!
  118. 118. Obrigado! @sergio_caelum

×