CDIPorque você deveria usarCDI em todos osseus projetos Java
sergiolopes.org@sergio_caelum
CDI
(
CDI
CDI
CDI
public class ProdutoDao {	 public void salvar(Produto produto) {     entityManager.persist(produto);	 }}
public class ProdutoDao {	 public void salvar(Produto produto) {    EntityManagerFactory factory =          Persistence.cr...
CDI
public class ProdutoDao {				 public void salvar(Produto produto) {	 	 entityManager.persist(produto);	 }}
public class ProdutoDao {		 private EntityManager entityManager;		 public ProdutoDao(EntityManager em) {	 	 this.entityMan...
public class ProdutoDao {		 private EntityManager entityManager;		 // recebo dependência pronta	 public ProdutoDao(EntityM...
injeção dedependências!
inversão de controle.injeção dedependências!
separação de responsabilidades.inversão de controle.injeção dedependências!
)
CDI
especificação cdiimplementação weld
public class ProdutoDao {		 private EntityManager entityManager;		 public ProdutoDao(EntityManager em) {	 	 this.entityMan...
public class ProdutoDao {		 private EntityManager entityManager;		 @Inject	 public ProdutoDao(EntityManager em) {	 	 this....
public class ProdutoDao {	 @Inject		 private EntityManager entityManager;	 public void salvar(Produto produto) {	 	 entity...
CDIinjeção com @Inject
public class ProdutoController {	   private ProdutoDao dao;		   public void insere() {	   	 Produto produto = // pega dado...
public class ProdutoController {	   @Inject	   private ProdutoDao dao;		   public void insere() {	   	 Produto produto = /...
injeçãofácil!
eoEntityManager?
CDImétodos produtores
public class JPAUtil {		 public EntityManager criaEM() {	 }	}
public class JPAUtil {		 public EntityManager criaEM() {	 	 EntityManagerFactory factory = Persistence          .createEnt...
public class JPAUtil {		 public EntityManager criaEM() {	 	 EntityManagerFactory factory = Persistence          .createEnt...
public class JPAUtil {	 @Produces	 public EntityManager criaEM() {	 	 EntityManagerFactory factory = Persistence          ...
quando criar oEntityManager?
public class JPAUtil {	 @Produces @RequestScoped	 public EntityManager criaEM() {	 	 EntityManagerFactory factory = Persis...
mas e afactory?
public class JPAUtil {		   @Produces @RequestScoped	   public EntityManager criaEM(){	       return factory.createEntityMa...
public class JPAUtil {	   @Produces	   public EntityManagerFactory criaFactory() {	   	 return Persistence.createEntityMan...
public class JPAUtil {	   @Produces	   public EntityManagerFactory criaFactory() {	   	 return Persistence.createEntityMan...
public class JPAUtil {	   @Produces	   public EntityManagerFactory criaFactory() {	   	 return Persistence.createEntityMan...
public class JPAUtil {	   @Produces @ApplicationScoped	   public EntityManagerFactory criaFactory() {	   	 return Persiste...
e quemfecha?
public class JPAUtil {	 public void fechaEM(EntityManager em) {	 	 em.close();	 }}
public class JPAUtil {	 public void fechaEM(@Disposes EntityManager em) {	 	 em.close();	 }}
gerenciamentodo ciclo de vida!
e mais de umbanco de dados?
public class JPAUtil {@Produces @ApplicationScopedpublic EntityManagerFactory criaFactory1() {}@Produces @RequestScopedpub...
public class JPAUtil {@Produces @ApplicationScopedpublic EntityManagerFactory criaFactory1() {}@Produces @RequestScopedpub...
public class JPAUtil {@Produces @ApplicationScopedpublic EntityManagerFactory criaFactory1() {}@Produces @RequestScopedpub...
CDIqualifiers
public class JPAUtil {@Produces @ApplicationScoped @Geralpublic EntityManagerFactory criaFactory1() {}@Produces @RequestSc...
public class JPAUtil {@Produces @ApplicationScoped @Geralpublic EntityManagerFactory criaFactory1() {}@Produces @RequestSc...
@Retention(RUNTIME)public @interface Diretor {}@Retention(RUNTIME)public @interface Geral {}
@Qualifier@Retention(RUNTIME)public @interface Diretor {}@Qualifier@Retention(RUNTIME)public @interface Geral {}
public class ProdutoDao {	 @Inject	 private EntityManager entityManager;	 public void salvar(Produto produto) {	 	 entityM...
public class ProdutoDao {	 @Inject @Geral		 private EntityManager entityManager;	 public void salvar(Produto produto) {	 	...
public class JPAUtil {@Produces @ApplicationScoped @Geralpublic EntityManagerFactory criaFactory1() {}@Produces @RequestSc...
public class BackupDeTudo {		 public void backupBDs() {	 }}
public class BackupDeTudo {	 @Inject @Any	 private Instance<EntityManager> todosEntityMangers;		 public void backupBDs() {...
public class BackupDeTudo {	   @Inject @Any	   private Instance<EntityManager> todosEntityMangers;		   public void backupB...
múltiplosbeans!
quem controlatransações?
public class ProdutoDao {		 @Inject private EntityManager entityManager;		 public void salvar(Produto produto) {	 	 entity...
public class ProdutoDao {		 @Inject private EntityManager entityManager;		 public void salvar(Produto produto) {	 	 entity...
public class ProdutoDao {		 @Inject private EntityManager entityManager;		 public void salvar(Produto produto) {	 	 entity...
public class ProdutoController {	   @Inject	   private ProdutoDao dao;		   public void substitui() {	   	 dao.salvar(produ...
CDIinterceptadores
public class ProdutoController {	   @Inject	   private ProdutoDao dao;		   @Transacional	   public void substitui() {	   	...
@InterceptorBinding@Retention(RUNTIME)public @interface Transacional { }
public class ProdutoDao {		 @Inject private EntityManager entityManager;		 public void salvar(Produto produto) {	 	 entity...
@Interceptor @Transacionalpublic class TransacionalInterceptor {	 	}
@Interceptor @Transacionalpublic class TransacionalInterceptor {	 @AroundInvoke	 public Object intercept(InvocationContext...
@Interceptor @Transacionalpublic class TransacionalInterceptor {	 @AroundInvoke	 public Object intercept(InvocationContext...
@Interceptor @Transacionalpublic class TransacionalInterceptor {	 @Inject private EntityManager em;	 @AroundInvoke	 public...
<beans> <interceptors>  <class>   br.com.caelum.TransacionalInterceptor  </class> </interceptors></beans>
maisencapsulado!
um processo decompra complexo
public class Pagamento {	 public void efetuaCobranca() {	 	 // ... comunica com Cielo	 }}
public class Estoque {	 public void reservaMercadoria() {	 	 // ... reserva produto no estoque	 }}
public class Notificacoes {	 public void notificaCompra() {	 	 // envia email confirmando pro usuario	 }}
public class FinalizaCompraController {		 public void finalizaCompra() {	 }}
public class FinalizaCompraController {	 @Inject private Pagamento pagamento;		 public void finalizaCompra() {	 	 pagament...
public class FinalizaCompraController {	 @Inject private Pagamento pagamento;	 @Inject private Estoque estoque;		 public v...
public class FinalizaCompraController {	   @Inject private Pagamento pagamento;	   @Inject private Estoque estoque;	   @In...
como desacoplaro processo?
CDIeventos
public class FinalizaCompraController {		 public void finalizaCompra() {	 }}
public class FinalizaCompraController {		 public void finalizaCompra() {	 	 Compra compra = new Compra(produto, cliente);	...
public class FinalizaCompraController {	   @Inject @Any	   private Event<Compra> eventoCompra;		   public void finalizaCom...
public class FinalizaCompraController {	   @Inject @Any	   private Event<Compra> eventoCompra;		   public void finalizaCom...
public class Pagamento {	 public void efetuaCobranca(Compra c) {	 	 // ... comunica com Cielo	 }}
public class Pagamento {	 public void efetuaCobranca(@Observes Compra c) {	 	 // ... comunica com Cielo	 }}
public class Pagamento {	 public void efetuaCobranca(@Observes Compra c) {	 	 // ... comunica com Cielo	 }}public class Es...
maisdesacoplado!
não quero cobraro cartão em teste
public class Pagamento {	 public void efetuaCobranca(@Observes Compra c) {    WebServiceCielo.cobraDeVerdade(c.getCartao()...
CDIalternatives
public class PagamentoDeVerdade {}public class PagamentoDeMentira {}
public class PagamentoDeVerdade {	 public void efetuaCobranca(@Observes Compra c) {	 }}public class PagamentoDeMentira {	 ...
public class PagamentoDeVerdade {	 public void efetuaCobranca(@Observes Compra c) {    WebServiceCielo.cobraDeVerdade(c.ge...
public class PagamentoDeVerdade implements Pagamento {	 public void efetuaCobranca(@Observes Compra c) {    WebServiceCiel...
public class PagamentoDeVerdade implements Pagamento {	 public void efetuaCobranca(@Observes Compra c) {    WebServiceCiel...
<beans> <alternatives>  <class>   br.com.caelum.PagamentoDeMentira  </class> </alternatives></beans>
CDIextensions spi
posso estendero próprio CDI!
public class HelloExtension implements Extension {	   		}
public class HelloExtension implements Extension {	   <T> void hiBean(@Observes ProcessAnnotatedType<T> pat) {	   		   }	}
public class HelloExtension implements Extension {	   <T> void hiBean(@Observes ProcessAnnotatedType<T> pat) {	   	 Class<...
META-INF/services/javax.enterprise.inject.spi.Extensionbr.com.caelum.HelloExtension
posso modificaros beans do CDI
public class ModulosOpcionaisExtension implements Extension{	   			}
public class ModulosOpcionaisExtension implements Extension{	   <T> void bloqueia(@Observes ProcessAnnotatedType<T> pat) {...
public class ModulosOpcionaisExtension implements Extension{	   <T> void bloqueia(@Observes ProcessAnnotatedType<T> pat) {...
public class ModulosOpcionaisExtension implements Extension{	   <T> void bloqueia(@Observes ProcessAnnotatedType<T> pat) {...
public class ModulosOpcionaisExtension implements Extension{	   <T> void bloqueia(@Observes ProcessAnnotatedType<T> pat) {...
dá pra estendermuito mais
decoratorsstereotypes               +injection pointscustom scopes                     CDIconversation scopemais de extens...
CDIVocê deveria usarCDI em todos osseus projetos Java!
Obrigado!@sergio_caelum
Upcoming SlideShare
Loading in …5
×

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

96,311 views
107,258 views

Published on

Palestra técnica dada no JavaOne Latin America 2012 sobre CDI e Java

Published in: Technology
1 Comment
50 Likes
Statistics
Notes
  • Muito boa a apresentação, curti
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
96,311
On SlideShare
0
From Embeds
0
Number of Embeds
79,459
Actions
Shares
0
Downloads
406
Comments
1
Likes
50
Embeds 0
No embeds

No notes for slide

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

  1. 1. CDIPorque você deveria usarCDI em todos osseus 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 dedependências!
  15. 15. inversão de controle.injeção dedependências!
  16. 16. separação de responsabilidades.inversão de controle.injeção dedependências!
  17. 17. )
  18. 18. CDI
  19. 19. especificação cdiimplementaçã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. CDIinjeçã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çãofácil!
  27. 27. eoEntityManager?
  28. 28. CDImé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 oEntityManager?
  34. 34. public class JPAUtil { @Produces @RequestScoped public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); } }
  35. 35. mas e afactory?
  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 quemfecha?
  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. gerenciamentodo ciclo de vida!
  45. 45. e mais de umbanco de dados?
  46. 46. public class JPAUtil {@Produces @ApplicationScopedpublic EntityManagerFactory criaFactory1() {}@Produces @RequestScopedpublic EntityManager criaEM1(EntityManagerFactory factory){}}
  47. 47. public class JPAUtil {@Produces @ApplicationScopedpublic EntityManagerFactory criaFactory1() {}@Produces @RequestScopedpublic EntityManager criaEM1(EntityManagerFactory factory){}@Produces @ApplicationScopedpublic EntityManagerFactory criaFactory2() {}@Produces @RequestScopedpublic EntityManager criaEM2(EntityManagerFactory factory){}}
  48. 48. public class JPAUtil {@Produces @ApplicationScopedpublic EntityManagerFactory criaFactory1() {}@Produces @RequestScopedpublic EntityManager criaEM1(EntityManagerFactory factory){}@Produces @ApplicationScopedpublic EntityManagerFactory criaFactory2() {}@Produces @RequestScoped ?public EntityManager criaEM2(EntityManagerFactory factory){}}
  49. 49. CDIqualifiers
  50. 50. public class JPAUtil {@Produces @ApplicationScoped @Geralpublic EntityManagerFactory criaFactory1() {}@Produces @RequestScopedpublic EntityManager criaEM1(EntityManagerFactory factory){}@Produces @ApplicationScoped @Diretorpublic EntityManagerFactory criaFactory2() {}@Produces @RequestScopedpublic EntityManager criaEM2(EntityManagerFactory factory){}}
  51. 51. public class JPAUtil {@Produces @ApplicationScoped @Geralpublic EntityManagerFactory criaFactory1() {}@Produces @RequestScopedpublic EntityManager criaEM1(@Geral EntityManagerFactory f){@Produces @ApplicationScoped @Diretorpublic EntityManagerFactory criaFactory2() {}@Produces @RequestScopedpublic 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 @Geralpublic EntityManagerFactory criaFactory1() {}@Produces @RequestScoped @Geralpublic EntityManager criaEM1(@Geral EntityManagerFactory f){@Produces @ApplicationScoped @Diretorpublic EntityManagerFactory criaFactory2() {}@Produces @RequestScoped @Diretorpublic 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últiplosbeans!
  61. 61. quem controlatransaçõ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. CDIinterceptadores
  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 @Transacionalpublic class TransacionalInterceptor { }
  71. 71. @Interceptor @Transacionalpublic class TransacionalInterceptor { @AroundInvoke public Object intercept(InvocationContext ctx) { }}
  72. 72. @Interceptor @Transacionalpublic 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 @Transacionalpublic 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. maisencapsulado!
  76. 76. um processo decompra 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 desacoplaro processo?
  85. 85. CDIeventos
  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. maisdesacoplado!
  94. 94. não quero cobraro cartão em teste
  95. 95. public class Pagamento { public void efetuaCobranca(@Observes Compra c) { WebServiceCielo.cobraDeVerdade(c.getCartao()); }}
  96. 96. CDIalternatives
  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()); }}@Alternativepublic 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. CDIextensions spi
  104. 104. posso estendero 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.Extensionbr.com.caelum.HelloExtension
  109. 109. posso modificaros 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 estendermuito mais
  116. 116. decoratorsstereotypes +injection pointscustom scopes CDIconversation scopemais de extensions
  117. 117. CDIVocê deveria usarCDI em todos osseus projetos Java!
  118. 118. Obrigado!@sergio_caelum

×