porque você deveria usar cdi nos seus projetos java! - javaone la 2012 - sérgio lopes

118
Porque você deveria usar CDI em todos os seus projetos Java CDI

Upload: caelum

Post on 15-Jan-2015

55.717 views

Category:

Technology


5 download

DESCRIPTION

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

TRANSCRIPT

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

Porque você deveria usarCDI em todos os seus projetos Java

CDI

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

@sergio_caelumsergiolopes.org

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

CDI

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

(

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

CDI

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

CDI

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

CDI

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

public class ProdutoDao { public void salvar(Produto produto) {

entityManager.persist(produto); }}

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

public class ProdutoDao { public void salvar(Produto produto) { EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa"); EntityManager entityManager = factory.createEntityManager();

entityManager.persist(produto); }}

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

CDI

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

public class ProdutoDao {

public void salvar(Produto produto) { entityManager.persist(produto); }}

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

public class ProdutoDao { private EntityManager entityManager;

public ProdutoDao(EntityManager em) { this.entityManager = em; }

public void salvar(Produto produto) { entityManager.persist(produto); }}

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

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); }}

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

injeção dedependências!

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

injeção dedependências!

inversão de controle.

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

injeção dedependências!

separação de responsabilidades.inversão de controle.

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

)

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

CDI

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

especificação cdiimplementação weld

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

public class ProdutoDao { private EntityManager entityManager;

public ProdutoDao(EntityManager em) { this.entityManager = em; }

public void salvar(Produto produto) { entityManager.persist(produto); }}

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

public class ProdutoDao { private EntityManager entityManager; @Inject public ProdutoDao(EntityManager em) { this.entityManager = em; }

public void salvar(Produto produto) { entityManager.persist(produto); }}

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

public class ProdutoDao {

@Inject private EntityManager entityManager;

public void salvar(Produto produto) { entityManager.persist(produto); }}

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

CDI

injeção com @Inject

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

public class ProdutoController {

private ProdutoDao dao; public void insere() { Produto produto = // pega dados no request dao.salvar(produto); }}

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

public class ProdutoController {

@Inject private ProdutoDao dao; public void insere() { Produto produto = // pega dados no request dao.salvar(produto); }}

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

injeção fácil!

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

e oEntityManager?

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

CDI

métodos produtores

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

public class JPAUtil {

public EntityManager criaEM() {

}}

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

public class JPAUtil {

public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); }}

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

public class JPAUtil {

public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); }}

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

public class JPAUtil {

@Produces public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); }}

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

quando criar oEntityManager?

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

public class JPAUtil {

@Produces @RequestScoped public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); }}

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

mas e afactory?

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

public class JPAUtil {

@Produces @RequestScoped public EntityManager criaEM(){ return factory.createEntityManager(); }}

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

public class JPAUtil {

@Produces public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(){ return factory.createEntityManager(); }}

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

public class JPAUtil {

@Produces public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(){ return factory.createEntityManager(); }}

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

public class JPAUtil {

@Produces public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(EntityManagerFactory factory){ return factory.createEntityManager(); }}

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

public class JPAUtil {

@Produces @ApplicationScoped public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(EntityManagerFactory factory){ return factory.createEntityManager(); }}

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

e quemfecha?

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

public class JPAUtil {

public void fechaEM(EntityManager em) { em.close(); }

}

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

public class JPAUtil {

public void fechaEM(@Disposes EntityManager em) { em.close(); }

}

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

gerenciamentodo ciclo de vida!

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

e mais de umbanco de dados?

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

public class JPAUtil {

@Produces @ApplicationScoped public EntityManagerFactory criaFactory1() {}

@Produces @RequestScoped public EntityManager criaEM1(EntityManagerFactory factory){}

}

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

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){} }

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

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){} }

?

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

CDI

qualifiers

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

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){} }

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

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){} }

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

@Retention(RUNTIME)public @interface Diretor {}

@Retention(RUNTIME)public @interface Geral {}

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

@Qualifier@Retention(RUNTIME)public @interface Diretor {}

@Qualifier@Retention(RUNTIME)public @interface Geral {}

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

public class ProdutoDao {

@Inject private EntityManager entityManager;

public void salvar(Produto produto) { entityManager.persist(produto); }}

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

public class ProdutoDao {

@Inject @Geral private EntityManager entityManager;

public void salvar(Produto produto) { entityManager.persist(produto); }}

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

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){} }

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

public class BackupDeTudo {

public void backupBDs() {

}}

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

public class BackupDeTudo {

@Inject @Any private Instance<EntityManager> todosEntityMangers; public void backupBDs() {

}}

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

public class BackupDeTudo {

@Inject @Any private Instance<EntityManager> todosEntityMangers; public void backupBDs() { for (EntityManager em : todosEntityMangers) { // ... } }}

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

múltiplosbeans!

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

quem controlatransações?

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

public class ProdutoDao { @Inject private EntityManager entityManager; public void salvar(Produto produto) { entityManager.getTransaction().begin(); entityManager.persist(produto); entityManager.getTransaction().commit(); }

}

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

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(); }}

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

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(); }}

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

public class ProdutoController {

@Inject private ProdutoDao dao; public void substitui() { dao.salvar(produtoNovo); dao.apagar(produtoAntigo); }}

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

CDI

interceptadores

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

public class ProdutoController {

@Inject private ProdutoDao dao; @Transacional public void substitui() { dao.salvar(produtoNovo); dao.apagar(produtoAntigo); }}

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

@InterceptorBinding@Retention(RUNTIME)public @interface Transacional { }

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

public class ProdutoDao { @Inject private EntityManager entityManager; public void salvar(Produto produto) { entityManager.persist(produto); } public void apagar(Produto produto) { entityManager.remove(produto); }}

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

@Interceptor @Transacionalpublic class TransacionalInterceptor {

}

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

@Interceptor @Transacionalpublic class TransacionalInterceptor {

@AroundInvoke public Object intercept(InvocationContext ctx) {

}}

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

@Interceptor @Transacionalpublic class TransacionalInterceptor {

@AroundInvoke public Object intercept(InvocationContext ctx) { // ... antes da lógica

Object resultado = ctx.proceed();

// ... depois da lógica return resultado; }}

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

@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; }}

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

<beans> <interceptors> <class> br.com.caelum.TransacionalInterceptor </class> </interceptors></beans>

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

maisencapsulado!

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

um processo decompra complexo

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

public class Pagamento {

public void efetuaCobranca() { // ... comunica com Cielo }}

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

public class Estoque {

public void reservaMercadoria() { // ... reserva produto no estoque }}

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

public class Notificacoes {

public void notificaCompra() { // envia email confirmando pro usuario }}

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

public class FinalizaCompraController {

public void finalizaCompra() {

}}

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

public class FinalizaCompraController {

@Inject private Pagamento pagamento;

public void finalizaCompra() { pagamento.efetuaCobranca();

}}

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

public class FinalizaCompraController {

@Inject private Pagamento pagamento; @Inject private Estoque estoque;

public void finalizaCompra() { pagamento.efetuaCobranca(); estoque.reservaMercadoria();

}}

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

public class FinalizaCompraController {

@Inject private Pagamento pagamento; @Inject private Estoque estoque; @Inject private Notificacoes notificacoes; public void finalizaCompra() { pagamento.efetuaCobranca(); estoque.reservaMercadoria(); notificacoes.notificaCompra(); }}

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

como desacoplaro processo?

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

CDI

eventos

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

public class FinalizaCompraController {

public void finalizaCompra() {

}}

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

public class FinalizaCompraController {

public void finalizaCompra() { Compra compra = new Compra(produto, cliente);

}}

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

public class FinalizaCompraController {

@Inject @Any private Event<Compra> eventoCompra; public void finalizaCompra() { Compra compra = new Compra(produto, cliente);

}}

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

public class FinalizaCompraController {

@Inject @Any private Event<Compra> eventoCompra; public void finalizaCompra() { Compra compra = new Compra(produto, cliente); eventoCompra.fire(compra); }}

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

public class Pagamento {

public void efetuaCobranca(Compra c) { // ... comunica com Cielo }}

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

public class Pagamento {

public void efetuaCobranca(@Observes Compra c) { // ... comunica com Cielo }}

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

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 }}

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

maisdesacoplado!

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

não quero cobraro cartão em teste

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

public class Pagamento {

public void efetuaCobranca(@Observes Compra c) {WebServiceCielo.cobraDeVerdade(c.getCartao());

}}

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

CDI

alternatives

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

public class PagamentoDeVerdade {

}

public class PagamentoDeMentira {

}

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

public class PagamentoDeVerdade {

public void efetuaCobranca(@Observes Compra c) {

}}

public class PagamentoDeMentira {

public void efetuaCobranca(@Observes Compra c) {

}}

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

public class PagamentoDeVerdade {

public void efetuaCobranca(@Observes Compra c) {WebServiceCielo.cobraDeVerdade(c.getCartao());

}}

public class PagamentoDeMentira {

public void efetuaCobranca(@Observes Compra c) { LogDeTeste.fariaUmaCompraAqui(); }}

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

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(); }}

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

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(); }}

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

<beans> <alternatives> <class> br.com.caelum.PagamentoDeMentira </class> </alternatives></beans>

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

CDI

extensions spi

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

posso estendero próprio CDI!

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

public class HelloExtension implements Extension {

}

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

public class HelloExtension implements Extension {

<T> void hiBean(@Observes ProcessAnnotatedType<T> pat) {

}}

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

public class HelloExtension implements Extension {

<T> void hiBean(@Observes ProcessAnnotatedType<T> pat) { Class<T> clazz = pat.getAnnotatedType().getJavaClass(); System.out.println("Hi! " + clazz.getName()); }}

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

META-INF/services/javax.enterprise.inject.spi.Extension

br.com.caelum.HelloExtension

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

posso modificaros beans do CDI

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

public class ModulosOpcionaisExtension implements Extension{

}

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

public class ModulosOpcionaisExtension implements Extension{

<T> void bloqueia(@Observes ProcessAnnotatedType<T> pat) {

}

}

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

public class ModulosOpcionaisExtension implements Extension{

<T> void bloqueia(@Observes ProcessAnnotatedType<T> pat) { Class<T> clazz = pat.getAnnotatedType().getJavaClass(); String packageName = clazz.getPackage().getName();

}

}

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

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"); }}

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

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"); }}

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

dá pra estendermuito mais

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

decoratorsstereotypesinjection pointscustom scopesconversation scopemais de extensions

CDI+

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

Você deveria usarCDI em todos os seus projetos Java!

CDI

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

Obrigado!@sergio_caelum