use cdi em seus projetos java !

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

Upload: leonardo-brancalhao

Post on 11-Jun-2015

559 views

Category:

Technology


2 download

DESCRIPTION

Excelente post da CAELUM !!!

TRANSCRIPT

Page 1: Use CDI em seus projetos Java !

Porque você deveria usarCDI em todos os seus projetos Java

CDI

Page 2: Use CDI em seus projetos Java !

@sergio_caelumsergiolopes.org

Page 3: Use CDI em seus projetos Java !

CDI

Page 4: Use CDI em seus projetos Java !

(

Page 5: Use CDI em seus projetos Java !

CDI

Page 6: Use CDI em seus projetos Java !

CDI

Page 7: Use CDI em seus projetos Java !

CDI

Page 8: Use CDI em seus projetos Java !

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

entityManager.persist(produto); }}

Page 9: Use CDI em seus projetos Java !

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

entityManager.persist(produto); }}

Page 10: Use CDI em seus projetos Java !

CDI

Page 11: Use CDI em seus projetos Java !

public class ProdutoDao {

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

Page 12: Use CDI em seus projetos Java !

public class ProdutoDao { private EntityManager entityManager;

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

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

Page 13: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

injeção dedependências!

Page 15: Use CDI em seus projetos Java !

injeção dedependências!

inversão de controle.

Page 16: Use CDI em seus projetos Java !

injeção dedependências!

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

Page 17: Use CDI em seus projetos Java !

)

Page 18: Use CDI em seus projetos Java !

CDI

Page 19: Use CDI em seus projetos Java !

especificação cdiimplementação weld

Page 20: Use CDI em seus projetos Java !

public class ProdutoDao { private EntityManager entityManager;

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

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

Page 21: Use CDI em seus projetos Java !

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

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

Page 22: Use CDI em seus projetos Java !

public class ProdutoDao {

@Inject private EntityManager entityManager;

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

Page 23: Use CDI em seus projetos Java !

CDI

injeção com @Inject

Page 24: Use CDI em seus projetos Java !

public class ProdutoController {

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

Page 25: Use CDI em seus projetos Java !

public class ProdutoController {

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

Page 26: Use CDI em seus projetos Java !

injeção fácil!

Page 27: Use CDI em seus projetos Java !

e oEntityManager?

Page 28: Use CDI em seus projetos Java !

CDI

métodos produtores

Page 29: Use CDI em seus projetos Java !

public class JPAUtil {

public EntityManager criaEM() {

}}

Page 30: Use CDI em seus projetos Java !

public class JPAUtil {

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

Page 31: Use CDI em seus projetos Java !

public class JPAUtil {

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

Page 32: Use CDI em seus projetos Java !

public class JPAUtil {

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

Page 33: Use CDI em seus projetos Java !

quando criar oEntityManager?

Page 34: Use CDI em seus projetos Java !

public class JPAUtil {

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

Page 35: Use CDI em seus projetos Java !

mas e afactory?

Page 36: Use CDI em seus projetos Java !

public class JPAUtil {

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

Page 37: Use CDI em seus projetos Java !

public class JPAUtil {

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

Page 38: Use CDI em seus projetos Java !

public class JPAUtil {

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

Page 39: Use CDI em seus projetos Java !

public class JPAUtil {

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

Page 40: Use CDI em seus projetos Java !

public class JPAUtil {

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

Page 41: Use CDI em seus projetos Java !

e quemfecha?

Page 42: Use CDI em seus projetos Java !

public class JPAUtil {

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

}

Page 43: Use CDI em seus projetos Java !

public class JPAUtil {

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

}

Page 44: Use CDI em seus projetos Java !

gerenciamentodo ciclo de vida!

Page 45: Use CDI em seus projetos Java !

e mais de umbanco de dados?

Page 46: Use CDI em seus projetos Java !

public class JPAUtil {

@Produces @ApplicationScoped public EntityManagerFactory criaFactory1() {}

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

}

Page 47: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

CDI

qualifiers

Page 50: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

@Retention(RUNTIME)public @interface Diretor {}

@Retention(RUNTIME)public @interface Geral {}

Page 53: Use CDI em seus projetos Java !

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

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

Page 54: Use CDI em seus projetos Java !

public class ProdutoDao {

@Inject private EntityManager entityManager;

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

Page 55: Use CDI em seus projetos Java !

public class ProdutoDao {

@Inject @Geral private EntityManager entityManager;

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

Page 56: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

public class BackupDeTudo {

public void backupBDs() {

}}

Page 58: Use CDI em seus projetos Java !

public class BackupDeTudo {

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

}}

Page 59: Use CDI em seus projetos Java !

public class BackupDeTudo {

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

Page 60: Use CDI em seus projetos Java !

múltiplosbeans!

Page 61: Use CDI em seus projetos Java !

quem controlatransações?

Page 62: Use CDI em seus projetos Java !

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

}

Page 63: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

public class ProdutoController {

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

Page 66: Use CDI em seus projetos Java !

CDI

interceptadores

Page 67: Use CDI em seus projetos Java !

public class ProdutoController {

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

Page 68: Use CDI em seus projetos Java !

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

Page 69: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

@Interceptor @Transacionalpublic class TransacionalInterceptor {

}

Page 71: Use CDI em seus projetos Java !

@Interceptor @Transacionalpublic class TransacionalInterceptor {

@AroundInvoke public Object intercept(InvocationContext ctx) {

}}

Page 72: Use CDI em seus projetos Java !

@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: Use CDI em seus projetos Java !

@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: Use CDI em seus projetos Java !

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

Page 75: Use CDI em seus projetos Java !

maisencapsulado!

Page 76: Use CDI em seus projetos Java !

um processo decompra complexo

Page 77: Use CDI em seus projetos Java !

public class Pagamento {

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

Page 78: Use CDI em seus projetos Java !

public class Estoque {

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

Page 79: Use CDI em seus projetos Java !

public class Notificacoes {

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

Page 80: Use CDI em seus projetos Java !

public class FinalizaCompraController {

public void finalizaCompra() {

}}

Page 81: Use CDI em seus projetos Java !

public class FinalizaCompraController {

@Inject private Pagamento pagamento;

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

}}

Page 82: Use CDI em seus projetos Java !

public class FinalizaCompraController {

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

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

}}

Page 83: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

como desacoplaro processo?

Page 85: Use CDI em seus projetos Java !

CDI

eventos

Page 86: Use CDI em seus projetos Java !

public class FinalizaCompraController {

public void finalizaCompra() {

}}

Page 87: Use CDI em seus projetos Java !

public class FinalizaCompraController {

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

}}

Page 88: Use CDI em seus projetos Java !

public class FinalizaCompraController {

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

}}

Page 89: Use CDI em seus projetos Java !

public class FinalizaCompraController {

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

Page 90: Use CDI em seus projetos Java !

public class Pagamento {

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

Page 91: Use CDI em seus projetos Java !

public class Pagamento {

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

Page 92: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

maisdesacoplado!

Page 94: Use CDI em seus projetos Java !

não quero cobraro cartão em teste

Page 95: Use CDI em seus projetos Java !

public class Pagamento {

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

}}

Page 96: Use CDI em seus projetos Java !

CDI

alternatives

Page 97: Use CDI em seus projetos Java !

public class PagamentoDeVerdade {

}

public class PagamentoDeMentira {

}

Page 98: Use CDI em seus projetos Java !

public class PagamentoDeVerdade {

public void efetuaCobranca(@Observes Compra c) {

}}

public class PagamentoDeMentira {

public void efetuaCobranca(@Observes Compra c) {

}}

Page 99: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

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

Page 103: Use CDI em seus projetos Java !

CDI

extensions spi

Page 104: Use CDI em seus projetos Java !

posso estendero próprio CDI!

Page 105: Use CDI em seus projetos Java !

public class HelloExtension implements Extension {

}

Page 106: Use CDI em seus projetos Java !

public class HelloExtension implements Extension {

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

}}

Page 107: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

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

br.com.caelum.HelloExtension

Page 109: Use CDI em seus projetos Java !

posso modificaros beans do CDI

Page 110: Use CDI em seus projetos Java !

public class ModulosOpcionaisExtension implements Extension{

}

Page 111: Use CDI em seus projetos Java !

public class ModulosOpcionaisExtension implements Extension{

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

}

}

Page 112: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

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: Use CDI em seus projetos Java !

dá pra estendermuito mais

Page 116: Use CDI em seus projetos Java !

decoratorsstereotypesinjection pointscustom scopesconversation scopemais de extensions

CDI+

Page 117: Use CDI em seus projetos Java !

Você deveria usarCDI em todos os seus projetos Java!

CDI

Page 118: Use CDI em seus projetos Java !

Obrigado!@sergio_caelum