SlideShare a Scribd company logo
1 of 118
Download to read offline
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.createEntityManagerFactory("jpa");
    EntityManager entityManager =
          factory.createEntityManager();
     entityManager.persist(produto);
	 }
}
CDI
public class ProdutoDao {
	

	

	




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

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


	 public void salvar(Produto produto) {
	 	 entityManager.persist(produto);
	 }
}
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);
	   }
}
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.entityManager = em;
	 }

	 public void salvar(Produto produto) {
	 	 entityManager.persist(produto);
	 }
}
public class ProdutoDao {
	
	 private EntityManager entityManager;
	
	 @Inject
	 public ProdutoDao(EntityManager em) {
	 	 this.entityManager = em;
	 }

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

	 @Inject	
	 private EntityManager entityManager;

	 public void salvar(Produto produto) {
	 	 entityManager.persist(produto);
	 }
}
CDI
injeção com @Inject
public class ProdutoController {


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

	   @Inject
	   private ProdutoDao dao;
	
	   public void insere() {
	   	 Produto produto = // pega dados no request
	   	 dao.salvar(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
          .createEntityManagerFactory("jpa");
	     return factory.createEntityManager();
	 }
	
}
public class JPAUtil {

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

	 @Produces
	 public EntityManager criaEM() {
	 	 EntityManagerFactory factory = Persistence
          .createEntityManagerFactory("jpa");
	     return factory.createEntityManager();
	 }
	
}
quando criar o
EntityManager?
public class JPAUtil {

	 @Produces @RequestScoped
	 public EntityManager criaEM() {
	 	 EntityManagerFactory factory = Persistence
          .createEntityManagerFactory("jpa");
	     return factory.createEntityManager();
	 }
	
}
mas e a
factory?
public class JPAUtil {




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

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

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

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

	   @Produces @ApplicationScoped
	   public EntityManagerFactory criaFactory() {
	   	 return Persistence.createEntityManagerFactory("jpa");
	   }
	
	   @Produces @RequestScoped
	   public EntityManager criaEM(EntityManagerFactory factory){
	       return factory.createEntityManager();
	   }
	
}
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 @RequestScoped
public EntityManager criaEM1(EntityManagerFactory factory){}




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

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

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

}
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

}
@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) {
	 	 entityManager.persist(produto);
	 }
}
public class ProdutoDao {

	 @Inject @Geral	
	 private EntityManager entityManager;

	 public void salvar(Produto produto) {
	 	 entityManager.persist(produto);
	 }
}
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

}
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 backupBDs() {
	   	 for (EntityManager em : todosEntityMangers) {
	   	 	 // ...
	   	 }
	   }
}
múltiplos
beans!
quem controla
transações?
public class ProdutoDao {
	
	 @Inject private EntityManager entityManager;
	
	 public void salvar(Produto produto) {
	 	 entityManager.getTransaction().begin();
	 	 entityManager.persist(produto);
	 	 entityManager.getTransaction().commit();
	 }
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();
	 }
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();
	 }
public class ProdutoController {

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

	   @Inject
	   private ProdutoDao dao;
	
	   @Transacional
	   public void substitui() {
	   	 dao.salvar(produtoNovo);
	   	 dao.apagar(produtoAntigo);
	   }
}
@InterceptorBinding
@Retention(RUNTIME)
public @interface Transacional { }
public class ProdutoDao {
	
	 @Inject private EntityManager entityManager;
	
	 public void salvar(Produto produto) {
	 	 entityManager.persist(produto);
	 }
	
	 public void apagar(Produto produto) {
	 	 entityManager.remove(produto);
	 }
}
@Interceptor @Transacional
public class TransacionalInterceptor {




	 	



}
@Interceptor @Transacional
public class TransacionalInterceptor {




	 @AroundInvoke
	 public Object intercept(InvocationContext ctx) {




	 	

	 }
}
@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;
	 }
}
@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;
	   }
}
<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() {
	 	 pagamento.efetuaCobranca();



	 }
}
public class FinalizaCompraController {

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

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

	 }
}
public class FinalizaCompraController {

	   @Inject private Pagamento pagamento;
	   @Inject private Estoque estoque;
	   @Inject private Notificacoes notificacoes;
	
	   public void finalizaCompra() {
	   	 pagamento.efetuaCobranca();
	   	 estoque.reservaMercadoria();
	   	 notificacoes.notificaCompra();
	   }
}
como desacoplar
o processo?
CDI
eventos
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 finalizaCompra() {
	   	 Compra compra = new Compra(produto, cliente);

	 }
}
public class FinalizaCompraController {

	   @Inject @Any
	   private Event<Compra> eventoCompra;
	
	   public void finalizaCompra() {
	   	 Compra compra = new Compra(produto, cliente);
	   	 eventoCompra.fire(compra);
	   }
}
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 Estoque {

	 public void reservaMercadoria(@Observes Compra c)
	 	 // ... reserva produto no estoque
	 }
}
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 PagamentoDeMentira {

	 public void efetuaCobranca(@Observes Compra c) {

	 }
}
public class PagamentoDeVerdade {

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



public class PagamentoDeMentira {

	 public void efetuaCobranca(@Observes Compra c) {
     LogDeTeste.fariaUmaCompraAqui();
	 }
}
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();
	 }
}
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();
	 }
}
<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) {
	   	 Class<T> clazz = pat.getAnnotatedType().getJavaClass();
	   	
	   	 System.out.println("Hi! " + clazz.getName());
	   }
	
}
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> pat) {
	   	 Class<T> clazz = pat.getAnnotatedType().getJavaClass();
	   	 String packageName = clazz.getPackage().getName();
	   	




	   }




	
}
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");
	   }
	
}
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");
	   }
	
}
dá pra estender
muito mais
decorators
stereotypes
               +
injection points
custom scopes
                     CDI

conversation scope
mais de extensions
CDI
Você deveria usar
CDI em todos os
seus projetos Java!
Obrigado!
@sergio_caelum

More Related Content

What's hot

Java orientação a objetos (interfaces)
Java   orientação a objetos (interfaces)Java   orientação a objetos (interfaces)
Java orientação a objetos (interfaces)Armando Daniel
 
Java CRUD Mechanism with SQL Server Database
Java CRUD Mechanism with SQL Server DatabaseJava CRUD Mechanism with SQL Server Database
Java CRUD Mechanism with SQL Server DatabaseDudy Ali
 
Java: Encapsulamento e modificadores de acesso
Java: Encapsulamento e modificadores de acessoJava: Encapsulamento e modificadores de acesso
Java: Encapsulamento e modificadores de acessoArthur Emanuel
 
OOP with Java - Continued
OOP with Java - Continued OOP with Java - Continued
OOP with Java - Continued Hitesh-Java
 
Hibernate
Hibernate Hibernate
Hibernate Sunil OS
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
 
JAVA Variables and Operators
JAVA Variables and OperatorsJAVA Variables and Operators
JAVA Variables and OperatorsSunil OS
 
Konsep Routing dalam Laravel (Pemrograman Web II)
Konsep Routing dalam Laravel (Pemrograman Web II)Konsep Routing dalam Laravel (Pemrograman Web II)
Konsep Routing dalam Laravel (Pemrograman Web II)I Gede Iwan Sudipa
 
Java Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By StepJava Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By StepGuo Albert
 
Introdução ao Android
Introdução ao AndroidIntrodução ao Android
Introdução ao AndroidJanynne Gomes
 
Advanced Java Practical File
Advanced Java Practical FileAdvanced Java Practical File
Advanced Java Practical FileSoumya Behera
 

What's hot (20)

POO - 19 - Elementos Estáticos
POO - 19 - Elementos EstáticosPOO - 19 - Elementos Estáticos
POO - 19 - Elementos Estáticos
 
Java orientação a objetos (interfaces)
Java   orientação a objetos (interfaces)Java   orientação a objetos (interfaces)
Java orientação a objetos (interfaces)
 
Java CRUD Mechanism with SQL Server Database
Java CRUD Mechanism with SQL Server DatabaseJava CRUD Mechanism with SQL Server Database
Java CRUD Mechanism with SQL Server Database
 
Java: Encapsulamento e modificadores de acesso
Java: Encapsulamento e modificadores de acessoJava: Encapsulamento e modificadores de acesso
Java: Encapsulamento e modificadores de acesso
 
OOP with Java - Continued
OOP with Java - Continued OOP with Java - Continued
OOP with Java - Continued
 
Hibernate
Hibernate Hibernate
Hibernate
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 
Spring Data Jpa
Spring Data JpaSpring Data Jpa
Spring Data Jpa
 
JAVA Variables and Operators
JAVA Variables and OperatorsJAVA Variables and Operators
JAVA Variables and Operators
 
C Propgramming.pdf
C Propgramming.pdfC Propgramming.pdf
C Propgramming.pdf
 
Konsep Routing dalam Laravel (Pemrograman Web II)
Konsep Routing dalam Laravel (Pemrograman Web II)Konsep Routing dalam Laravel (Pemrograman Web II)
Konsep Routing dalam Laravel (Pemrograman Web II)
 
Introduction to es6
Introduction to es6Introduction to es6
Introduction to es6
 
4.3 MySQL + PHP
4.3 MySQL + PHP4.3 MySQL + PHP
4.3 MySQL + PHP
 
Java Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By StepJava Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By Step
 
Java interface
Java interfaceJava interface
Java interface
 
Introdução ao Android
Introdução ao AndroidIntrodução ao Android
Introdução ao Android
 
Java persistence api 2.1
Java persistence api 2.1Java persistence api 2.1
Java persistence api 2.1
 
Java 8 streams
Java 8 streamsJava 8 streams
Java 8 streams
 
JDBC
JDBCJDBC
JDBC
 
Advanced Java Practical File
Advanced Java Practical FileAdvanced Java Practical File
Advanced Java Practical File
 

Viewers also liked

Wsrest 2013
Wsrest 2013Wsrest 2013
Wsrest 2013Caelum
 
Otimizações de Performance Web: Desafios do Mundo Mobile
Otimizações de Performance Web: Desafios do Mundo MobileOtimizações de Performance Web: Desafios do Mundo Mobile
Otimizações de Performance Web: Desafios do Mundo MobileCaelum
 
Performance Web além do carregamento
Performance Web além do carregamentoPerformance Web além do carregamento
Performance Web além do carregamentoCaelum
 
Performance na web: o modelo RAIL e outras novidades
Performance na web: o modelo RAIL e outras novidadesPerformance na web: o modelo RAIL e outras novidades
Performance na web: o modelo RAIL e outras novidadesCaelum
 
Desafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJSDesafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJSCaelum
 
Os Caminhos de uma Estratégia Mobile
Os Caminhos de uma Estratégia MobileOs Caminhos de uma Estratégia Mobile
Os Caminhos de uma Estratégia MobileCaelum
 
Otimizando o time to market - do zero a produção em poucas iterações
Otimizando o time to market - do zero a produção em poucas iteraçõesOtimizando o time to market - do zero a produção em poucas iterações
Otimizando o time to market - do zero a produção em poucas iteraçõesCaelum
 
All you need to know about JavaScript loading and execution in the browser - ...
All you need to know about JavaScript loading and execution in the browser - ...All you need to know about JavaScript loading and execution in the browser - ...
All you need to know about JavaScript loading and execution in the browser - ...Caelum
 
Design Responsivo por uma Web única
Design Responsivo por uma Web únicaDesign Responsivo por uma Web única
Design Responsivo por uma Web únicaCaelum
 
[QCon 2011] Por uma web mais rápida: técnicas de otimização de Sites
[QCon 2011] Por uma web mais rápida: técnicas de otimização de Sites[QCon 2011] Por uma web mais rápida: técnicas de otimização de Sites
[QCon 2011] Por uma web mais rápida: técnicas de otimização de SitesCaelum
 

Viewers also liked (10)

Wsrest 2013
Wsrest 2013Wsrest 2013
Wsrest 2013
 
Otimizações de Performance Web: Desafios do Mundo Mobile
Otimizações de Performance Web: Desafios do Mundo MobileOtimizações de Performance Web: Desafios do Mundo Mobile
Otimizações de Performance Web: Desafios do Mundo Mobile
 
Performance Web além do carregamento
Performance Web além do carregamentoPerformance Web além do carregamento
Performance Web além do carregamento
 
Performance na web: o modelo RAIL e outras novidades
Performance na web: o modelo RAIL e outras novidadesPerformance na web: o modelo RAIL e outras novidades
Performance na web: o modelo RAIL e outras novidades
 
Desafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJSDesafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJS
 
Os Caminhos de uma Estratégia Mobile
Os Caminhos de uma Estratégia MobileOs Caminhos de uma Estratégia Mobile
Os Caminhos de uma Estratégia Mobile
 
Otimizando o time to market - do zero a produção em poucas iterações
Otimizando o time to market - do zero a produção em poucas iteraçõesOtimizando o time to market - do zero a produção em poucas iterações
Otimizando o time to market - do zero a produção em poucas iterações
 
All you need to know about JavaScript loading and execution in the browser - ...
All you need to know about JavaScript loading and execution in the browser - ...All you need to know about JavaScript loading and execution in the browser - ...
All you need to know about JavaScript loading and execution in the browser - ...
 
Design Responsivo por uma Web única
Design Responsivo por uma Web únicaDesign Responsivo por uma Web única
Design Responsivo por uma Web única
 
[QCon 2011] Por uma web mais rápida: técnicas de otimização de Sites
[QCon 2011] Por uma web mais rápida: técnicas de otimização de Sites[QCon 2011] Por uma web mais rápida: técnicas de otimização de Sites
[QCon 2011] Por uma web mais rápida: técnicas de otimização de Sites
 

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

Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014David Robert Camargo de Campos
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dadosHenrique Fernandes
 
Android DevConference - SOLID no Android
Android DevConference - SOLID no AndroidAndroid DevConference - SOLID no Android
Android DevConference - SOLID no AndroidiMasters
 
Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2Giovanni Bassi
 
VRaptor - Alta produtividade no Desenvolvimento Web em Java
VRaptor - Alta produtividade no Desenvolvimento Web em JavaVRaptor - Alta produtividade no Desenvolvimento Web em Java
VRaptor - Alta produtividade no Desenvolvimento Web em JavaDaniel Faria Gomes
 
better faster stronger dagger
better faster stronger daggerbetter faster stronger dagger
better faster stronger daggertdc-globalcode
 
Introducao ao Spring Web MVC
Introducao ao Spring Web MVCIntroducao ao Spring Web MVC
Introducao ao Spring Web MVCEder Magalhães
 
Android DevConference - Dagger 2: uso avançado em projetos Android
Android DevConference - Dagger 2: uso avançado em projetos AndroidAndroid DevConference - Dagger 2: uso avançado em projetos Android
Android DevConference - Dagger 2: uso avançado em projetos AndroidiMasters
 
Aplicacoes gráficas em Java
Aplicacoes gráficas em JavaAplicacoes gráficas em Java
Aplicacoes gráficas em JavaMarco Reis
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
Persistência com JPA e Hibernate
Persistência com JPA e HibernatePersistência com JPA e Hibernate
Persistência com JPA e HibernateFernando Oliveira
 
Conexao Java - Sua primeira app Android
Conexao Java - Sua primeira app AndroidConexao Java - Sua primeira app Android
Conexao Java - Sua primeira app AndroidSuelen Carvalho
 
Design Patterns na Programação de Jogo
Design Patterns na Programação de JogoDesign Patterns na Programação de Jogo
Design Patterns na Programação de JogoBruno Cicanci
 

Similar to Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérgio Lopes (20)

Use CDI em seus projetos Java !
Use CDI em seus projetos Java !Use CDI em seus projetos Java !
Use CDI em seus projetos Java !
 
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
 
Vraptor
VraptorVraptor
Vraptor
 
VRaptor4
VRaptor4VRaptor4
VRaptor4
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
 
Git, GitHub e OO
Git, GitHub e OOGit, GitHub e OO
Git, GitHub e OO
 
Android na Prática
Android na PráticaAndroid na Prática
Android na Prática
 
Spring MVC - QConSP
Spring MVC - QConSPSpring MVC - QConSP
Spring MVC - QConSP
 
Android DevConference - SOLID no Android
Android DevConference - SOLID no AndroidAndroid DevConference - SOLID no Android
Android DevConference - SOLID no Android
 
Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2
 
VRaptor - Alta produtividade no Desenvolvimento Web em Java
VRaptor - Alta produtividade no Desenvolvimento Web em JavaVRaptor - Alta produtividade no Desenvolvimento Web em Java
VRaptor - Alta produtividade no Desenvolvimento Web em Java
 
better faster stronger dagger
better faster stronger daggerbetter faster stronger dagger
better faster stronger dagger
 
Introducao ao Spring Web MVC
Introducao ao Spring Web MVCIntroducao ao Spring Web MVC
Introducao ao Spring Web MVC
 
Android DevConference - Dagger 2: uso avançado em projetos Android
Android DevConference - Dagger 2: uso avançado em projetos AndroidAndroid DevConference - Dagger 2: uso avançado em projetos Android
Android DevConference - Dagger 2: uso avançado em projetos Android
 
Aplicacoes gráficas em Java
Aplicacoes gráficas em JavaAplicacoes gráficas em Java
Aplicacoes gráficas em Java
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Persistência com JPA e Hibernate
Persistência com JPA e HibernatePersistência com JPA e Hibernate
Persistência com JPA e Hibernate
 
Conexao Java - Sua primeira app Android
Conexao Java - Sua primeira app AndroidConexao Java - Sua primeira app Android
Conexao Java - Sua primeira app Android
 
Clean code
Clean codeClean code
Clean code
 
Design Patterns na Programação de Jogo
Design Patterns na Programação de JogoDesign Patterns na Programação de Jogo
Design Patterns na Programação de Jogo
 

More from Caelum

Progressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficadaProgressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficadaCaelum
 
Tudo que você precisa saber sobre picture e srcset
Tudo que você precisa saber sobre picture e srcsetTudo que você precisa saber sobre picture e srcset
Tudo que você precisa saber sobre picture e srcsetCaelum
 
Como o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vidaComo o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vidaCaelum
 
Métricas e a automatização do controle de qualidade
Métricas e a automatização do controle de qualidadeMétricas e a automatização do controle de qualidade
Métricas e a automatização do controle de qualidadeCaelum
 
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio LopesHTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio LopesCaelum
 
Offline Web com Service Workers - Sérgio Lopes
Offline Web com Service Workers - Sérgio LopesOffline Web com Service Workers - Sérgio Lopes
Offline Web com Service Workers - Sérgio LopesCaelum
 
Design Responsivo - MobCamp 2014
Design Responsivo - MobCamp 2014Design Responsivo - MobCamp 2014
Design Responsivo - MobCamp 2014Caelum
 
Além do responsive design: a mudança de paradigma do design adaptativo e os m...
Além do responsive design: a mudança de paradigma do design adaptativo e os m...Além do responsive design: a mudança de paradigma do design adaptativo e os m...
Além do responsive design: a mudança de paradigma do design adaptativo e os m...Caelum
 
Por trás dos frameworks e além do reflection
Por trás dos frameworks e além do reflectionPor trás dos frameworks e além do reflection
Por trás dos frameworks e além do reflectionCaelum
 
Introducao a inteligencia artificial na educacao
Introducao a inteligencia artificial na educacaoIntroducao a inteligencia artificial na educacao
Introducao a inteligencia artificial na educacaoCaelum
 
[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...
[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...
[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...Caelum
 
Plataforma java: detalhes da JVM
Plataforma java: detalhes da JVMPlataforma java: detalhes da JVM
Plataforma java: detalhes da JVMCaelum
 
CDI e as ideias pro futuro do VRaptor
CDI e as ideias pro futuro do VRaptorCDI e as ideias pro futuro do VRaptor
CDI e as ideias pro futuro do VRaptorCaelum
 
Qualidade de código - a qualidade que faz a diferença
Qualidade de código - a qualidade que faz a diferençaQualidade de código - a qualidade que faz a diferença
Qualidade de código - a qualidade que faz a diferençaCaelum
 
Design de código: qualidade que faz a diferença, qcon 2011
Design de código: qualidade que faz a diferença, qcon 2011Design de código: qualidade que faz a diferença, qcon 2011
Design de código: qualidade que faz a diferença, qcon 2011Caelum
 
Agile2011
Agile2011Agile2011
Agile2011Caelum
 
Práticas para um Site Otimizado - CaelumDay in Rio 2011
Práticas para um Site Otimizado - CaelumDay in Rio 2011Práticas para um Site Otimizado - CaelumDay in Rio 2011
Práticas para um Site Otimizado - CaelumDay in Rio 2011Caelum
 
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo SilveiraServlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo SilveiraCaelum
 
Como fabricar dinheiro: Otimizações de Sites e porque isso vai deixá-lo rico ...
Como fabricar dinheiro: Otimizações de Sites e porque isso vai deixá-lo rico ...Como fabricar dinheiro: Otimizações de Sites e porque isso vai deixá-lo rico ...
Como fabricar dinheiro: Otimizações de Sites e porque isso vai deixá-lo rico ...Caelum
 
Google Android - WTJatai
Google Android - WTJataiGoogle Android - WTJatai
Google Android - WTJataiCaelum
 

More from Caelum (20)

Progressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficadaProgressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficada
 
Tudo que você precisa saber sobre picture e srcset
Tudo que você precisa saber sobre picture e srcsetTudo que você precisa saber sobre picture e srcset
Tudo que você precisa saber sobre picture e srcset
 
Como o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vidaComo o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vida
 
Métricas e a automatização do controle de qualidade
Métricas e a automatização do controle de qualidadeMétricas e a automatização do controle de qualidade
Métricas e a automatização do controle de qualidade
 
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio LopesHTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
 
Offline Web com Service Workers - Sérgio Lopes
Offline Web com Service Workers - Sérgio LopesOffline Web com Service Workers - Sérgio Lopes
Offline Web com Service Workers - Sérgio Lopes
 
Design Responsivo - MobCamp 2014
Design Responsivo - MobCamp 2014Design Responsivo - MobCamp 2014
Design Responsivo - MobCamp 2014
 
Além do responsive design: a mudança de paradigma do design adaptativo e os m...
Além do responsive design: a mudança de paradigma do design adaptativo e os m...Além do responsive design: a mudança de paradigma do design adaptativo e os m...
Além do responsive design: a mudança de paradigma do design adaptativo e os m...
 
Por trás dos frameworks e além do reflection
Por trás dos frameworks e além do reflectionPor trás dos frameworks e além do reflection
Por trás dos frameworks e além do reflection
 
Introducao a inteligencia artificial na educacao
Introducao a inteligencia artificial na educacaoIntroducao a inteligencia artificial na educacao
Introducao a inteligencia artificial na educacao
 
[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...
[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...
[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...
 
Plataforma java: detalhes da JVM
Plataforma java: detalhes da JVMPlataforma java: detalhes da JVM
Plataforma java: detalhes da JVM
 
CDI e as ideias pro futuro do VRaptor
CDI e as ideias pro futuro do VRaptorCDI e as ideias pro futuro do VRaptor
CDI e as ideias pro futuro do VRaptor
 
Qualidade de código - a qualidade que faz a diferença
Qualidade de código - a qualidade que faz a diferençaQualidade de código - a qualidade que faz a diferença
Qualidade de código - a qualidade que faz a diferença
 
Design de código: qualidade que faz a diferença, qcon 2011
Design de código: qualidade que faz a diferença, qcon 2011Design de código: qualidade que faz a diferença, qcon 2011
Design de código: qualidade que faz a diferença, qcon 2011
 
Agile2011
Agile2011Agile2011
Agile2011
 
Práticas para um Site Otimizado - CaelumDay in Rio 2011
Práticas para um Site Otimizado - CaelumDay in Rio 2011Práticas para um Site Otimizado - CaelumDay in Rio 2011
Práticas para um Site Otimizado - CaelumDay in Rio 2011
 
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo SilveiraServlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
 
Como fabricar dinheiro: Otimizações de Sites e porque isso vai deixá-lo rico ...
Como fabricar dinheiro: Otimizações de Sites e porque isso vai deixá-lo rico ...Como fabricar dinheiro: Otimizações de Sites e porque isso vai deixá-lo rico ...
Como fabricar dinheiro: Otimizações de Sites e porque isso vai deixá-lo rico ...
 
Google Android - WTJatai
Google Android - WTJataiGoogle Android - WTJatai
Google Android - WTJatai
 

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

  • 1. CDI Porque você deveria usar CDI em todos os seus projetos Java
  • 3. CDI
  • 4. (
  • 5. CDI
  • 6. CDI
  • 7. CDI
  • 8. public class ProdutoDao { public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 9. public class ProdutoDao { public void salvar(Produto produto) { EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa"); EntityManager entityManager = factory.createEntityManager(); entityManager.persist(produto); } }
  • 10. CDI
  • 11. public class ProdutoDao { public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 12. public class ProdutoDao { private EntityManager entityManager; public ProdutoDao(EntityManager em) { this.entityManager = em; } public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 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); } }
  • 15. inversão de controle. injeção de dependências!
  • 16. separação de responsabilidades. inversão de controle. injeção de dependências!
  • 17. )
  • 18. CDI
  • 20. public class ProdutoDao { private EntityManager entityManager; public ProdutoDao(EntityManager em) { this.entityManager = em; } public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 21. public class ProdutoDao { private EntityManager entityManager; @Inject public ProdutoDao(EntityManager em) { this.entityManager = em; } public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 22. public class ProdutoDao { @Inject private EntityManager entityManager; public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 24. public class ProdutoController { private ProdutoDao dao; public void insere() { Produto produto = // pega dados no request dao.salvar(produto); } }
  • 25. public class ProdutoController { @Inject private ProdutoDao dao; public void insere() { Produto produto = // pega dados no request dao.salvar(produto); } }
  • 29. public class JPAUtil { public EntityManager criaEM() { } }
  • 30. public class JPAUtil { public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); } }
  • 31. public class JPAUtil { public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); } }
  • 32. public class JPAUtil { @Produces public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); } }
  • 34. public class JPAUtil { @Produces @RequestScoped public EntityManager criaEM() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("jpa"); return factory.createEntityManager(); } }
  • 36. public class JPAUtil { @Produces @RequestScoped public EntityManager criaEM(){ return factory.createEntityManager(); } }
  • 37. public class JPAUtil { @Produces public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(){ return factory.createEntityManager(); } }
  • 38. public class JPAUtil { @Produces public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(){ return factory.createEntityManager(); } }
  • 39. public class JPAUtil { @Produces public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(EntityManagerFactory factory){ return factory.createEntityManager(); } }
  • 40. public class JPAUtil { @Produces @ApplicationScoped public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa"); } @Produces @RequestScoped public EntityManager criaEM(EntityManagerFactory factory){ return factory.createEntityManager(); } }
  • 42. public class JPAUtil { public void fechaEM(EntityManager em) { em.close(); } }
  • 43. public class JPAUtil { public void fechaEM(@Disposes EntityManager em) { em.close(); } }
  • 45. e mais de um banco de dados?
  • 46. public class JPAUtil { @Produces @ApplicationScoped public EntityManagerFactory criaFactory1() {} @Produces @RequestScoped public EntityManager criaEM1(EntityManagerFactory factory){} }
  • 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. 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){} }
  • 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. 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. @Retention(RUNTIME) public @interface Diretor {} @Retention(RUNTIME) public @interface Geral {}
  • 53. @Qualifier @Retention(RUNTIME) public @interface Diretor {} @Qualifier @Retention(RUNTIME) public @interface Geral {}
  • 54. public class ProdutoDao { @Inject private EntityManager entityManager; public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 55. public class ProdutoDao { @Inject @Geral private EntityManager entityManager; public void salvar(Produto produto) { entityManager.persist(produto); } }
  • 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. public class BackupDeTudo { public void backupBDs() { } }
  • 58. public class BackupDeTudo { @Inject @Any private Instance<EntityManager> todosEntityMangers; public void backupBDs() { } }
  • 59. public class BackupDeTudo { @Inject @Any private Instance<EntityManager> todosEntityMangers; public void backupBDs() { for (EntityManager em : todosEntityMangers) { // ... } } }
  • 62. public class ProdutoDao { @Inject private EntityManager entityManager; public void salvar(Produto produto) { entityManager.getTransaction().begin(); entityManager.persist(produto); entityManager.getTransaction().commit(); }
  • 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. 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. public class ProdutoController { @Inject private ProdutoDao dao; public void substitui() { dao.salvar(produtoNovo); dao.apagar(produtoAntigo); } }
  • 67. public class ProdutoController { @Inject private ProdutoDao dao; @Transacional public void substitui() { dao.salvar(produtoNovo); dao.apagar(produtoAntigo); } }
  • 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. @Interceptor @Transacional public class TransacionalInterceptor { }
  • 71. @Interceptor @Transacional public class TransacionalInterceptor { @AroundInvoke public Object intercept(InvocationContext ctx) { } }
  • 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. @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. <beans> <interceptors> <class> br.com.caelum.TransacionalInterceptor </class> </interceptors> </beans>
  • 77. public class Pagamento { public void efetuaCobranca() { // ... comunica com Cielo } }
  • 78. public class Estoque { public void reservaMercadoria() { // ... reserva produto no estoque } }
  • 79. public class Notificacoes { public void notificaCompra() { // envia email confirmando pro usuario } }
  • 80. public class FinalizaCompraController { public void finalizaCompra() { } }
  • 81. public class FinalizaCompraController { @Inject private Pagamento pagamento; public void finalizaCompra() { pagamento.efetuaCobranca(); } }
  • 82. public class FinalizaCompraController { @Inject private Pagamento pagamento; @Inject private Estoque estoque; public void finalizaCompra() { pagamento.efetuaCobranca(); estoque.reservaMercadoria(); } }
  • 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(); } }
  • 86. public class FinalizaCompraController { public void finalizaCompra() { } }
  • 87. public class FinalizaCompraController { public void finalizaCompra() { Compra compra = new Compra(produto, cliente); } }
  • 88. public class FinalizaCompraController { @Inject @Any private Event<Compra> eventoCompra; public void finalizaCompra() { Compra compra = new Compra(produto, cliente); } }
  • 89. public class FinalizaCompraController { @Inject @Any private Event<Compra> eventoCompra; public void finalizaCompra() { Compra compra = new Compra(produto, cliente); eventoCompra.fire(compra); } }
  • 90. public class Pagamento { public void efetuaCobranca(Compra c) { // ... comunica com Cielo } }
  • 91. public class Pagamento { public void efetuaCobranca(@Observes Compra c) { // ... comunica com Cielo } }
  • 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 } }
  • 94. não quero cobrar o cartão em teste
  • 95. public class Pagamento { public void efetuaCobranca(@Observes Compra c) { WebServiceCielo.cobraDeVerdade(c.getCartao()); } }
  • 97. public class PagamentoDeVerdade { } public class PagamentoDeMentira { }
  • 98. public class PagamentoDeVerdade { public void efetuaCobranca(@Observes Compra c) { } } public class PagamentoDeMentira { public void efetuaCobranca(@Observes Compra c) { } }
  • 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. 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. 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. <beans> <alternatives> <class> br.com.caelum.PagamentoDeMentira </class> </alternatives> </beans>
  • 105. public class HelloExtension implements Extension { }
  • 106. public class HelloExtension implements Extension { <T> void hiBean(@Observes ProcessAnnotatedType<T> pat) { } }
  • 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()); } }
  • 110. public class ModulosOpcionaisExtension implements Extension{ }
  • 111. public class ModulosOpcionaisExtension implements Extension{ <T> void bloqueia(@Observes ProcessAnnotatedType<T> pat) { } }
  • 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. 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. 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"); } }
  • 116. decorators stereotypes + injection points custom scopes CDI conversation scope mais de extensions
  • 117. CDI Você deveria usar CDI em todos os seus projetos Java!