Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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

125,147 views

Published on

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

Published in: Technology
  • Muito boa a apresentação, curti
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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

×