• Like
Use CDI em seus projetos Java !
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Use CDI em seus projetos Java !

  • 436 views
Published

Excelente post da CAELUM !!!

Excelente post da CAELUM !!!

Published in Technology , Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
436
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
19
Comments
0
Likes
3

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. CDI Porque você deveria usar CDI em todos os seus projetos Java
  • 2. sergiolopes.org @sergio_caelum
  • 3. CDI
  • 4. (
  • 5. CDI
  • 6. CDI
  • 7. CDI
  • 8. public class ProdutoDao { public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 9. public class ProdutoDao { public void salvar(Produto produto) { EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa"); EntityManager entityManager = factory.createEntityManager(); entityManager.persist(produto); } }
  • 10. CDI
  • 11. public class ProdutoDao { public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 12. public class ProdutoDao { private EntityManager entityManager; public ProdutoDao(EntityManager em) { this.entityManager = em; } public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 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. injeção de dependências!
  • 15. inversão de controle. injeção de dependências!
  • 16. separação de responsabilidades. inversão de controle. injeção de dependências!
  • 17. )
  • 18. CDI
  • 19. especificação cdi implementação weld
  • 20. public class ProdutoDao { private EntityManager entityManager; public ProdutoDao(EntityManager em) { this.entityManager = em; } public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 21. public class ProdutoDao { private EntityManager entityManager; @Inject public ProdutoDao(EntityManager em) { this.entityManager = em; } public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 22. public class ProdutoDao { @Inject private EntityManager entityManager; public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 23. CDI injeção com @Inject
  • 24. public class ProdutoController { } private ProdutoDao dao; public void insere() { Produto produto = // pega dados no request dao.salvar(produto); }
  • 25. public class ProdutoController { } @Inject private ProdutoDao dao; public void insere() { Produto produto = // pega dados no request dao.salvar(produto); }
  • 26. injeção fácil!
  • 27. eo EntityManager?
  • 28. CDI métodos produtores
  • 29. public class JPAUtil { public EntityManager criaEM() { } }
  • 30. public class JPAUtil { public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); } }
  • 31. public class JPAUtil { public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); } }
  • 32. public class JPAUtil { @Produces public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); } }
  • 33. quando criar o EntityManager?
  • 34. public class JPAUtil { @Produces @RequestScoped public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); } }
  • 35. mas e a factory?
  • 36. public class JPAUtil { } @Produces @RequestScoped public EntityManager criaEM(){ return factory.createEntityManager(); }
  • 37. public class JPAUtil { } @Produces public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(){ return factory.createEntityManager(); }
  • 38. public class JPAUtil { } @Produces public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(){ return factory.createEntityManager(); }
  • 39. public class JPAUtil { } @Produces public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(EntityManagerFactory factory){ return factory.createEntityManager(); }
  • 40. public class JPAUtil { } @Produces @ApplicationScoped public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(EntityManagerFactory factory){ return factory.createEntityManager(); }
  • 41. e quem fecha?
  • 42. public class JPAUtil { public void fechaEM(EntityManager em) { em.close(); } }
  • 43. public class JPAUtil { public void fechaEM(@Disposes EntityManager em) { em.close(); } }
  • 44. gerenciamento do ciclo de vida!
  • 45. e mais de um banco de dados?
  • 46. public class JPAUtil { @Produces @ApplicationScoped public EntityManagerFactory criaFactory1() {} @Produces @RequestScoped public EntityManager criaEM1(EntityManagerFactory factory){} }
  • 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. 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. CDI qualifiers
  • 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. 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. @Retention(RUNTIME) public @interface Diretor {} @Retention(RUNTIME) public @interface Geral {}
  • 53. @Qualifier @Retention(RUNTIME) public @interface Diretor {} @Qualifier @Retention(RUNTIME) public @interface Geral {}
  • 54. public class ProdutoDao { @Inject private EntityManager entityManager; public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 55. public class ProdutoDao { @Inject @Geral private EntityManager entityManager; public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 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. public class BackupDeTudo { public void backupBDs() { } }
  • 58. public class BackupDeTudo { @Inject @Any private Instance<EntityManager> todosEntityMangers; public void backupBDs() { } }
  • 59. public class BackupDeTudo { } @Inject @Any private Instance<EntityManager> todosEntityMangers; public void backupBDs() { for (EntityManager em : todosEntityMangers) { // ... } }
  • 60. múltiplos beans!
  • 61. quem controla transações?
  • 62. public class ProdutoDao { @Inject private EntityManager entityManager; public void salvar(Produto produto) { entityManager.getTransaction().begin(); entityManager.persist(produto); entityManager.getTransaction().commit(); }
  • 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. 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. public class ProdutoController { } @Inject private ProdutoDao dao; public void substitui() { dao.salvar(produtoNovo); dao.apagar(produtoAntigo); }
  • 66. CDI interceptadores
  • 67. public class ProdutoController { } @Inject private ProdutoDao dao; @Transacional public void substitui() { dao.salvar(produtoNovo); dao.apagar(produtoAntigo); }
  • 68. @InterceptorBinding @Retention(RUNTIME) public @interface Transacional { }
  • 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. @Interceptor @Transacional public class TransacionalInterceptor { }
  • 71. @Interceptor @Transacional public class TransacionalInterceptor { @AroundInvoke public Object intercept(InvocationContext ctx) { } }
  • 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. @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. <beans> <interceptors> <class> br.com.caelum.TransacionalInterceptor </class> </interceptors> </beans>
  • 75. mais encapsulado!
  • 76. um processo de compra complexo
  • 77. public class Pagamento { public void efetuaCobranca() { // ... comunica com Cielo } }
  • 78. public class Estoque { public void reservaMercadoria() { // ... reserva produto no estoque } }
  • 79. public class Notificacoes { public void notificaCompra() { // envia email confirmando pro usuario } }
  • 80. public class FinalizaCompraController { public void finalizaCompra() { } }
  • 81. public class FinalizaCompraController { @Inject private Pagamento pagamento; public void finalizaCompra() { pagamento.efetuaCobranca(); } }
  • 82. public class FinalizaCompraController { @Inject private Pagamento pagamento; @Inject private Estoque estoque; public void finalizaCompra() { pagamento.efetuaCobranca(); estoque.reservaMercadoria(); } }
  • 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. como desacoplar o processo?
  • 85. CDI eventos
  • 86. public class FinalizaCompraController { public void finalizaCompra() { } }
  • 87. public class FinalizaCompraController { public void finalizaCompra() { Compra compra = new Compra(produto, cliente); } }
  • 88. public class FinalizaCompraController { @Inject @Any private Event<Compra> eventoCompra; public void finalizaCompra() { Compra compra = new Compra(produto, cliente); } }
  • 89. public class FinalizaCompraController { } @Inject @Any private Event<Compra> eventoCompra; public void finalizaCompra() { Compra compra = new Compra(produto, cliente); eventoCompra.fire(compra); }
  • 90. public class Pagamento { public void efetuaCobranca(Compra c) { // ... comunica com Cielo } }
  • 91. public class Pagamento { public void efetuaCobranca(@Observes Compra c) { // ... comunica com Cielo } }
  • 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. mais desacoplado!
  • 94. não quero cobrar o cartão em teste
  • 95. public class Pagamento { public void efetuaCobranca(@Observes Compra c) { WebServiceCielo.cobraDeVerdade(c.getCartao()); } }
  • 96. CDI alternatives
  • 97. public class PagamentoDeVerdade { } public class PagamentoDeMentira { }
  • 98. public class PagamentoDeVerdade { public void efetuaCobranca(@Observes Compra c) { } } public class PagamentoDeMentira { public void efetuaCobranca(@Observes Compra c) { } }
  • 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. 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. 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. <beans> <alternatives> <class> br.com.caelum.PagamentoDeMentira </class> </alternatives> </beans>
  • 103. CDI extensions spi
  • 104. posso estender o próprio CDI!
  • 105. public class HelloExtension implements Extension { }
  • 106. public class HelloExtension implements Extension { <T> void hiBean(@Observes ProcessAnnotatedType<T> pat) { } }
  • 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. META-INF/services/javax.enterprise.inject.spi.Extension br.com.caelum.HelloExtension
  • 109. posso modificar os beans do CDI
  • 110. public class ModulosOpcionaisExtension implements Extension{ }
  • 111. public class ModulosOpcionaisExtension implements Extension{ <T> void bloqueia(@Observes ProcessAnnotatedType<T> pat) { } }
  • 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. 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. 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. dá pra estender muito mais
  • 116. + decorators stereotypes injection points custom scopes conversation scope mais de extensions CDI
  • 117. CDI Você deveria usar CDI em todos os seus projetos Java!
  • 118. Obrigado! @sergio_caelum