Successfully reported this slideshow.
CDI
Porque você deveria usar
CDI em todos os
seus 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.createEntityM...
CDI
public class ProdutoDao {
	
	
	

	 public void salvar(Produto produto) {
	 	 entityManager.persist(produto);
	 }
}
public class ProdutoDao {
	
	 private EntityManager entityManager;
	
	 public ProdutoDao(EntityManager em) {
	 	 this.enti...
public class ProdutoDao {
	
	 private EntityManager entityManager;
	
	 // recebo dependência pronta
	 public ProdutoDao(En...
injeção de
dependências!
inversão de controle.

injeção de
dependências!
separação de responsabilidades.
inversão de controle.

injeção de
dependências!
)
CDI
especificação cdi
implementação weld
public class ProdutoDao {
	
	 private EntityManager entityManager;
	
	 public ProdutoDao(EntityManager em) {
	 	 this.enti...
public class ProdutoDao {
	
	 private EntityManager entityManager;
	
	 @Inject
	 public ProdutoDao(EntityManager em) {
	 	...
public class ProdutoDao {
	 @Inject	
	 private EntityManager entityManager;
	 public void salvar(Produto produto) {
	 	 en...
CDI
injeção com @Inject
public class ProdutoController {

	
	
	
	
	
	
}

private ProdutoDao dao;
public void insere() {
	 Produto produto = // peg...
public class ProdutoController {
	
	
	
	
	
	
	
}

@Inject
private ProdutoDao dao;
public void insere() {
	 Produto produto...
injeção
fácil!
eo
EntityManager?
CDI
métodos produtores
public class JPAUtil {
	
	 public EntityManager criaEM() {

	 }
	
}
public class JPAUtil {
	
	 public EntityManager criaEM() {
	 	 EntityManagerFactory factory = Persistence
.createEntityMan...
public class JPAUtil {
	
	 public EntityManager criaEM() {
	 	 EntityManagerFactory factory = Persistence
.createEntityMan...
public class JPAUtil {
	 @Produces
	 public EntityManager criaEM() {
	 	 EntityManagerFactory factory = Persistence
.creat...
quando criar o
EntityManager?
public class JPAUtil {
	 @Produces @RequestScoped
	 public EntityManager criaEM() {
	 	 EntityManagerFactory factory = Per...
mas e a
factory?
public class JPAUtil {

	
	
	
	
	
	
}

@Produces @RequestScoped
public EntityManager criaEM(){
return factory.createEntity...
public class JPAUtil {
	
	
	
	
	
	
	
	
	
	
}

@Produces
public EntityManagerFactory criaFactory() {
	 return Persistence.c...
public class JPAUtil {
	
	
	
	
	
	
	
	
	
	
}

@Produces
public EntityManagerFactory criaFactory() {
	 return Persistence.c...
public class JPAUtil {
	
	
	
	
	
	
	
	
	
	
}

@Produces
public EntityManagerFactory criaFactory() {
	 return Persistence.c...
public class JPAUtil {
	
	
	
	
	
	
	
	
	
	
}

@Produces @ApplicationScoped
public EntityManagerFactory criaFactory() {
	 r...
e quem
fecha?
public class JPAUtil {
	 public void fechaEM(EntityManager em) {
	 	 em.close();
	 }
}
public class JPAUtil {
	 public void fechaEM(@Disposes EntityManager em) {
	 	 em.close();
	 }
}
gerenciamento
do ciclo de vida!
e mais de um
banco de dados?
public class JPAUtil {
@Produces @ApplicationScoped
public EntityManagerFactory criaFactory1() {}

@Produces @RequestScope...
public class JPAUtil {
@Produces @ApplicationScoped
public EntityManagerFactory criaFactory1() {}

@Produces @RequestScope...
public class JPAUtil {
@Produces @ApplicationScoped
public EntityManagerFactory criaFactory1() {}

@Produces @RequestScope...
CDI
qualifiers
public class JPAUtil {
@Produces @ApplicationScoped @Geral
public EntityManagerFactory criaFactory1() {}

@Produces @Reque...
public class JPAUtil {
@Produces @ApplicationScoped @Geral
public EntityManagerFactory criaFactory1() {}

@Produces @Reque...
@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) {
	 	 ent...
public class ProdutoDao {
	 @Inject @Geral	
	 private EntityManager entityManager;
	 public void salvar(Produto produto) {...
public class JPAUtil {
@Produces @ApplicationScoped @Geral
public EntityManagerFactory criaFactory1() {}

@Produces @Reque...
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 voi...
múltiplos
beans!
quem controla
transações?
public class ProdutoDao {
	
	 @Inject private EntityManager entityManager;
	
	 public void salvar(Produto produto) {
	 	 e...
public class ProdutoDao {
	
	 @Inject private EntityManager entityManager;
	
	 public void salvar(Produto produto) {
	 	 e...
public class ProdutoDao {
	
	 @Inject private EntityManager entityManager;
	
	 public void salvar(Produto produto) {
	 	 e...
public class ProdutoController {
	
	
	
	
	
	
	
}

@Inject
private ProdutoDao dao;
public void substitui() {
	 dao.salvar(p...
CDI
interceptadores
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) {
	 	 e...
@Interceptor @Transacional
public class TransacionalInterceptor {

	 	

}
@Interceptor @Transacional
public class TransacionalInterceptor {

	 @AroundInvoke
	 public Object intercept(InvocationCon...
@Interceptor @Transacional
public class TransacionalInterceptor {

	 @AroundInvoke
	 public Object intercept(InvocationCon...
@Interceptor @Transacional
public class TransacionalInterceptor {
	 @Inject private EntityManager em;
	 @AroundInvoke
	 pu...
<beans>
<interceptors>
<class>
br.com.caelum.TransacionalInterceptor
</class>
</interceptors>
</beans>
mais
encapsulado!
um processo de
compra 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() {
	 	 pag...
public class FinalizaCompraController {
	 @Inject private Pagamento pagamento;
	 @Inject private Estoque estoque;
	
	 publ...
public class FinalizaCompraController {
	
	
	
	
	
	
	
	
	
}

@Inject private Pagamento pagamento;
@Inject private Estoque ...
como desacoplar
o processo?
CDI
eventos
public class FinalizaCompraController {

	
	 public void finalizaCompra() {

	 }
}
public class FinalizaCompraController {

	
	 public void finalizaCompra() {
	 	 Compra compra = new Compra(produto, client...
public class FinalizaCompraController {
	
	
	
	
	

@Inject @Any
private Event<Compra> eventoCompra;
public void finalizaCo...
public class FinalizaCompraController {
	
	
	
	
	
	
	
}

@Inject @Any
private Event<Compra> eventoCompra;
public void fina...
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 cla...
mais
desacoplado!
não quero cobrar
o cartão em teste
public class Pagamento {
	 public void efetuaCobranca(@Observes Compra c) {
WebServiceCielo.cobraDeVerdade(c.getCartao());...
CDI
alternatives
public class PagamentoDeVerdade {

}

public class PagamentoDeMentira {

}
public class PagamentoDeVerdade {
	 public void efetuaCobranca(@Observes Compra c) {
	 }
}

public class PagamentoDeMentir...
public class PagamentoDeVerdade {
	 public void efetuaCobranca(@Observes Compra c) {
WebServiceCielo.cobraDeVerdade(c.getC...
public class PagamentoDeVerdade implements Pagamento {
	 public void efetuaCobranca(@Observes Compra c) {
WebServiceCielo....
public class PagamentoDeVerdade implements Pagamento {
	 public void efetuaCobranca(@Observes Compra c) {
WebServiceCielo....
<beans>
<alternatives>
<class>
br.com.caelum.PagamentoDeMentira
</class>
</alternatives>
</beans>
CDI
extensions spi
posso estender
o 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) {...
META-INF/services/javax.enterprise.inject.spi.Extension

br.com.caelum.HelloExtension
posso modificar
os 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>...
public class ModulosOpcionaisExtension implements Extension{

	
	
	
	
	

<T> void bloqueia(@Observes ProcessAnnotatedType<...
public class ModulosOpcionaisExtension implements Extension{

	
	
	
	
	
	

	

	
	
	
	
	
}

<T> void bloqueia(@Observes Pro...
dá pra estender
muito mais
+

decorators
stereotypes
injection points
custom scopes
conversation scope
mais de extensions

CDI
CDI
Você deveria usar
CDI em todos os
seus projetos Java!
Obrigado!
@sergio_caelum
Upcoming SlideShare
Loading in …5
×

Use CDI em seus projetos Java !

1,378 views

Published on

Excelente post da CAELUM !!!

Published in: Technology, Education

Use CDI em seus projetos Java !

  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 conversation scope mais de extensions CDI
  117. 117. CDI Você deveria usar CDI em todos os seus projetos Java!
  118. 118. Obrigado! @sergio_caelum

×