SlideShare uma empresa Scribd logo
1 de 45
Baixar para ler offline
Aplicando CDI em aplicações
Java
Michel Graciano
Aplicando CDI em aplicações Java *
Michel Graciano
•+14 anos de experiência com a plataforma Java
•Trabalha na Betha Sistemas Ltds e instrutor na Código
Efetivo
•Membro do SouJava e GUJavaSC
•Membro de projetos open-source como NetBeans
entre outros
•Já apresentou palestras no JavaOne, JustJava e The
Developer's Conference
2
Aplicando CDI em aplicações Java
Agenda
•Revisão rápida CDI
•Recursos chave CDI
•Aplicando na vida real
✓Demos
•Q&A
3
Aplicando CDI em aplicações Java
Terminologia
•JSR 299 - CDI
✓Contexts and Dependency Injection for the Java EE platform
•Weld
✓JSR-299: Implementação de referência
4
Aplicando CDI em aplicações Java
“CDI is more than a framework. It's a whole, rich
programming model. The theme of CDI is loose-coupling
with strong typing.”
Documentação do Weld
5
Aplicando CDI em aplicações Java
•Beans podem ser injetados utilizando @Inject
Revisão rápida CDI
6
@Inject
Greeting greeting;
Aplicando CDI em aplicações Java
•Beans podem ser injetados utilizando @Inject
•Beans injetados pode ser filtrados ou resolvidos através
do uso de qualificadores
@Inject
Greeting greeting;
@Informal
@Inject
Greeting greeting;
Revisão rápida CDI
7
Aplicando CDI em aplicações Java
Revisão rápida CDI
•Beans podem ser nomeados utilizando @Named
@Named(“pageModel”)
public class PageModel {
public getName() { ... }
}
<h:body>
#{pageModel.name}
</h:body>
8
Aplicando CDI em aplicações Java
•Beans com inicialização diferenciada podem ser
construídos utilizando produtores
public class Shop {
@Produces
PaymentProcessor getPaymentProcessor() { ... }
@Produces
List<Product> getProducts() { ... }
}
Revisão rápida CDI
9
Aplicando CDI em aplicações Java
•Beans com inicialização diferenciada podem ser
construídos utilizando produtores
public class Shop {
@Produces
@ApplicationScoped
@Catalog
@Named("catalog")
List<Product> getProducts() { ... }
}
Revisão rápida CDI
10
Aplicando CDI em aplicações Java
Revisão rápida CDI
•Ativação e configuração via arquivo beans.xml
11
Aplicando CDI em aplicações Java
Suporte a Java SE
● SeContainerInitializer é a api para configurar e
inicializar um container CDI no Java SE.
public static void main(String[] args) {
SeContainer container = SeContainerInitializer.newInstance()
.disableDiscovery()
.addBeanClasses(MyService.class)
.initialize();
MyService service = container.select(MyService.class).get();
service.sayHello();
container.close();
}
Aplicando CDI em aplicações Java
Suporte a Java SE
● Retorna um SeContainer o qual implementa
Instance<Object> permitindo lookup programático
public static void main(String[] args) {
SeContainer container = SeContainerInitializer.newInstance()
.disableDiscovery()
.addBeanClasses(MyService.class)
.initialize();
MyService service = container.select(MyService.class).get();
service.sayHello();
container.close();
}
Aplicando CDI em aplicações Java
Mas por que
CDI?
14
Aplicando CDI em aplicações Java
Recursos chave CDI
•Combinação de escopos
•Sistema de eventos
•AOP sem interfaces
•Acesso ao ponto de injeção
•Extensões (Portable extensions)
Designing Java EE Applications in the Age of CDI
15
Aplicando CDI em aplicações Java
Combinação de escopos
•Escopos determinam o ciclo de vida dos beans e podem
ser combinados conforme necessário
@ApplicationScoped
public class System implements Serializable {
@Inject
User user;
...
}
@SessionScoped
public class User implements Serializable { ... }
16
Aplicando CDI em aplicações Java
Escopos personalizados
•Seam
✓RenderScoped
•MyFaces CODI
✓@ConversationScoped
✓@WindowScoped
✓@ViewAccessScoped
•Apache DeltaSpike
✓@TransactionScoped
17
Aplicando CDI em aplicações Java
@SessionScoped
public class ShoppingCart implements Serializable {
private User customer;
@Inject
public ShoppingCart(User customer) {
this.customer = customer;
}
...
}
Construtores de beans
18
Aplicando CDI em aplicações Java
@ConversationScoped
public class Order {
private Product product;
private User customer;
@Inject
void setProduct(@Selected Product p) {
this.product = p;
}
@Inject
public void setCustomer(User customer) {
this.customer = customer;
}
}
Métodos inicializadores
19
Aplicando CDI em aplicações Java
•Sistema de eventos de baixo acoplamento
public void afterDocumentUpdate(
@Observes @Updated Document document) { ... }
@Inject @Any Event<Document> event;
...
public void someMethod() {
event.fire(document);
}
Sistema de eventos
20
Aplicando CDI em aplicações Java
•Sistema de eventos de baixo acoplamento
•Eventos podem ser filtrados utilizando qualificadores
public void afterDocumentUpdate(
@Observes @Updated Document document) { ... }
public void onAnyDocumentEvent(
@Observes Document document) { ... }
@Inject @Updated Event<Document> event;
...
public void someMethod() {
event.fire(document);
}
Sistema de eventos
21
Aplicando CDI em aplicações Java
•Sistema de eventos de baixo acoplamento
•Eventos podem ser filtrados utilizando qualificadores
•Prioridades podem ser definidas com @Priority
public void afterDocumentUpdate(
@Observes @Priority(2) @Updated Document
document) { ... }
public void onAnyDocumentEvent(
@Observes @Priority(1) Document document) { ... }
Sistema de eventos
22
Aplicando CDI em aplicações Java
Sistema de eventos
•Observadores condicionais
✓IF_EXISTS
✓ALWAYS
public void afterDocumentUpdate(
@Observes(receive=IF_EXISTS)
@Updated Document document) { ... }
23
Aplicando CDI em aplicações Java
Sistema de eventos
•Observadores transacionais
✓IN_PROGRESS,
✓BEFORE_COMPLETION,
✓AFTER_COMPLETION,
✓AFTER_FAILURE,
✓AFTER_SUCCESS
public void afterDocumentUpdate(
@Observes(during=AFTER_SUCCESS)
@Updated Document document) { ... }
24
Aplicando CDI em aplicações Java
Sistema de eventos assíncronos
•Eventos síncronos utilizam fire() e chamam apenas
@Observes
•Eventos síncronos utilizam o método fireAsync()e
chamam apenas @ObservesAsync
25
Aplicando CDI em aplicações Java
AOP sem interfaces
•Interceptadores desacoplam necessidades técnicas da
lógica de negócio
✓Ortogonal à aplicação e sistema de tipos
•Decoradores permitem que necessidades de negócio
sejam compartimentalizadas utilizando o conceito de
interceptadores
✓Anexado a um tipo Java, conhece a semântica do negócio
•Configurável
✓Habilitado e ordenado via beans.xml
26
Aplicando CDI em aplicações Java
@Inherited
@InterceptorBinding
@Target({TYPE, METHOD})
@Retention(RUNTIME)
public @interface Secure {}
Interceptors
27
Aplicando CDI em aplicações Java
@Secure
public class System {
...
}
public class ShoppingCart {
@Secure
public void placeOrder() { ... }
}
Interceptors
28
Aplicando CDI em aplicações Java
@Secure
@Interceptor
public class SecurityInterceptor {
@AroundInvoke
public Object manageSecurity(
InvocationContext ctx) throws Exception {
// manage security...
ctx.proceed();
}
}
Interceptors
29
Aplicando CDI em aplicações Java
Decorators
@Decorator
class TimestampLogger implements Logger {
@Inject @Delegate @Any Logger logger;
void log(String message) {
logger.log( timestamp() + ": " +
message );
}
...
}
30
Aplicando CDI em aplicações Java
Lookup programático
● Instance<Object> permite lookup programático de
instâncias
@Inject Intance<MyService> instances;
...
public void someMethod() {
MyService service =
instances.select(MyService.class).get();
...
}
Aplicando CDI em aplicações Java
Acesso ao ponto de injeção (injection point)
•Empodera os produtores com a capacidade de reagir de
acordo com o ponto de injeção
•Permitido para beans com escopo @Dependent para
obter informações sobre os pontos de injeção o qual a
invocação pertence
32
Aplicando CDI em aplicações Java
@Produces
Logger createLogger(InjectionPoint ip) {
return Logger.getLogger(
ip.getMember().getDeclaringClass().
getName());
}
Acesso ao ponto de injeção (injection point)
33
Aplicando CDI em aplicações Java
Extensões
<T> void processAnnotatedType(@Observes final
ProcessAnnotatedType<T> pat) {
final AnnotatedTypeBuilder builder =
new AnnotatedTypeBuilder().
readFromType(pat.getAnnotatedType(),
true).addToClass(Model.INSTANCE);
pat.setAnnotatedType(builder.create());
}
34
Aplicando CDI em aplicações Java
Extensões
void beforeShutdown(@Observes BeforeShutdown bs,
MBeanServer mbs, BeanDetailsController c) throws
Exception {
for (ObjectName objectName :
c.getRegisteredObjectNames()) {
mbs.unregisterMBean(objectName);
}
}
35
Aplicando CDI em aplicações Java
Extensões
<X> void processInjectionTarget(@Observes
ProcessInjectionTarget<X> pit) {
for (InjectionPoint ip :
pit.getInjectionTarget().
getInjectionPoints()) {
...
}
}
36
Aplicando CDI em aplicações Java
Named queries são validadas tardiamente
37
Aplicando CDI em aplicações Java
Named queries são validadas tardiamente
38
Aplicando CDI em aplicações Java
Named queries são validadas tardiamente
39
Aplicando CDI em aplicações Java
Typesafe @TypedQuery
40
Aplicando CDI em aplicações Java
Typesafe @TypedQuery
-------------------------------------------------------------
COMPILATION ERROR :
-------------------------------------------------------------
and returns false.
model/CustomerModel.java:[47,25] error: Named query 'Customer.findByNme' not defined yet.
model/CustomerModel.java:[43,25] error: Named query 'Customer.findAl' not defined yet.
2 errors
-------------------------------------------------------------
41
Aplicando CDI em aplicações Java
Demo
42
Aplicando CDI em aplicações Java
O que foi usado neste exemplo?
•CDI
✓Injeção de dependência
✓Métodos produtores
✓Acesso ao injection point
✓Seleção programática de instância via qualifier
•Annotation processors
43
Aplicando CDI em aplicações Java
Referências
● CDI Spec
○ http://cdi-spec.org/
● Wildfly Swarm
○ http://wildfly-swarm.io/
● Deltaspike
○ https://deltaspike.apache.org/
● Weld
○ http://weld.cdi-spec.org/
Aplicando CDI em aplicações Java
Q&A
Michel Graciano | @mgraciano
https://github.com/mgraciano/javanoroeste-cdi-2018
45

Mais conteúdo relacionado

Semelhante a Aplicando CDI em aplicações Java

Minicurso Objective-C
Minicurso Objective-CMinicurso Objective-C
Minicurso Objective-CSaulo Arruda
 
JHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãosJHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãosThiago Soares
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?Rafael Benevides
 
Seminário sd android_exemplos
Seminário sd android_exemplosSeminário sd android_exemplos
Seminário sd android_exemplosCalvin Rodrigues
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDDDextra
 
CDI -Contextos e Dependências
CDI -Contextos e DependênciasCDI -Contextos e Dependências
CDI -Contextos e DependênciasWende Mendes
 
[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2Felipe Pimentel
 
[Java] Contexts and Dependency Injection em JEE6
[Java] Contexts and Dependency Injection em JEE6[Java] Contexts and Dependency Injection em JEE6
[Java] Contexts and Dependency Injection em JEE6Jose Naves Moura Neto
 
JavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computingJavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computingEder Magalhães
 
Backend em aplicações Android - Google I/O 2015
Backend em aplicações Android - Google I/O 2015Backend em aplicações Android - Google I/O 2015
Backend em aplicações Android - Google I/O 2015Thales Lima
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETslides_teltools
 
WebSiviu - Sistema de Informação sobre Violência Urbana.
WebSiviu - Sistema de Informação sobre Violência Urbana.WebSiviu - Sistema de Informação sobre Violência Urbana.
WebSiviu - Sistema de Informação sobre Violência Urbana.Gabriel Mariano
 
Workshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring BootWorkshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring BootRodrigo Cândido da Silva
 

Semelhante a Aplicando CDI em aplicações Java (20)

Minicurso Objective-C
Minicurso Objective-CMinicurso Objective-C
Minicurso Objective-C
 
JHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãosJHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãos
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
 
Seminário sd android_exemplos
Seminário sd android_exemplosSeminário sd android_exemplos
Seminário sd android_exemplos
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDD
 
CDI -Contextos e Dependências
CDI -Contextos e DependênciasCDI -Contextos e Dependências
CDI -Contextos e Dependências
 
[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2
 
[Java] Contexts and Dependency Injection em JEE6
[Java] Contexts and Dependency Injection em JEE6[Java] Contexts and Dependency Injection em JEE6
[Java] Contexts and Dependency Injection em JEE6
 
Mini curso JBC
Mini curso JBCMini curso JBC
Mini curso JBC
 
JavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computingJavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computing
 
Backend em aplicações Android - Google I/O 2015
Backend em aplicações Android - Google I/O 2015Backend em aplicações Android - Google I/O 2015
Backend em aplicações Android - Google I/O 2015
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NET
 
Mini curso de c#.net
Mini curso de c#.netMini curso de c#.net
Mini curso de c#.net
 
WebSiviu - Sistema de Informação sobre Violência Urbana.
WebSiviu - Sistema de Informação sobre Violência Urbana.WebSiviu - Sistema de Informação sobre Violência Urbana.
WebSiviu - Sistema de Informação sobre Violência Urbana.
 
Curso AngularJS - Parte 1
Curso AngularJS - Parte 1Curso AngularJS - Parte 1
Curso AngularJS - Parte 1
 
Workshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring BootWorkshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring Boot
 
Spring MVC - QConSP
Spring MVC - QConSPSpring MVC - QConSP
Spring MVC - QConSP
 
API Apontador
API ApontadorAPI Apontador
API Apontador
 
Aula parte 2 de JSF 2.2
Aula parte 2 de JSF 2.2Aula parte 2 de JSF 2.2
Aula parte 2 de JSF 2.2
 

Mais de Michel Graciano

O papel e a carreira de um desenvolvedor de software
O papel e a carreira de um desenvolvedor de softwareO papel e a carreira de um desenvolvedor de software
O papel e a carreira de um desenvolvedor de softwareMichel Graciano
 
Finalmente java sabe trabalhar com data e hora (gu java sc)
Finalmente java sabe trabalhar com data e hora (gu java sc)Finalmente java sabe trabalhar com data e hora (gu java sc)
Finalmente java sabe trabalhar com data e hora (gu java sc)Michel Graciano
 
CON6423: Scalable JavaScript applications with Project Nashorn
CON6423: Scalable JavaScript applications with Project NashornCON6423: Scalable JavaScript applications with Project Nashorn
CON6423: Scalable JavaScript applications with Project NashornMichel Graciano
 
Finalmente java sabe trabalhar com data e hora
Finalmente java sabe trabalhar com data e horaFinalmente java sabe trabalhar com data e hora
Finalmente java sabe trabalhar com data e horaMichel Graciano
 
Designing Java EE Applications in the Age of CDI
Designing Java EE Applications in the Age of CDIDesigning Java EE Applications in the Age of CDI
Designing Java EE Applications in the Age of CDIMichel Graciano
 
Introdução a CDI e como utilizá-la em aplicações reais
Introdução a CDI e como utilizá-la em aplicações reaisIntrodução a CDI e como utilizá-la em aplicações reais
Introdução a CDI e como utilizá-la em aplicações reaisMichel Graciano
 
genesis - Acelerando o desenvolvimento de aplicações desktop
genesis - Acelerando o desenvolvimento de aplicações desktopgenesis - Acelerando o desenvolvimento de aplicações desktop
genesis - Acelerando o desenvolvimento de aplicações desktopMichel Graciano
 

Mais de Michel Graciano (7)

O papel e a carreira de um desenvolvedor de software
O papel e a carreira de um desenvolvedor de softwareO papel e a carreira de um desenvolvedor de software
O papel e a carreira de um desenvolvedor de software
 
Finalmente java sabe trabalhar com data e hora (gu java sc)
Finalmente java sabe trabalhar com data e hora (gu java sc)Finalmente java sabe trabalhar com data e hora (gu java sc)
Finalmente java sabe trabalhar com data e hora (gu java sc)
 
CON6423: Scalable JavaScript applications with Project Nashorn
CON6423: Scalable JavaScript applications with Project NashornCON6423: Scalable JavaScript applications with Project Nashorn
CON6423: Scalable JavaScript applications with Project Nashorn
 
Finalmente java sabe trabalhar com data e hora
Finalmente java sabe trabalhar com data e horaFinalmente java sabe trabalhar com data e hora
Finalmente java sabe trabalhar com data e hora
 
Designing Java EE Applications in the Age of CDI
Designing Java EE Applications in the Age of CDIDesigning Java EE Applications in the Age of CDI
Designing Java EE Applications in the Age of CDI
 
Introdução a CDI e como utilizá-la em aplicações reais
Introdução a CDI e como utilizá-la em aplicações reaisIntrodução a CDI e como utilizá-la em aplicações reais
Introdução a CDI e como utilizá-la em aplicações reais
 
genesis - Acelerando o desenvolvimento de aplicações desktop
genesis - Acelerando o desenvolvimento de aplicações desktopgenesis - Acelerando o desenvolvimento de aplicações desktop
genesis - Acelerando o desenvolvimento de aplicações desktop
 

Aplicando CDI em aplicações Java

  • 1. Aplicando CDI em aplicações Java Michel Graciano
  • 2. Aplicando CDI em aplicações Java * Michel Graciano •+14 anos de experiência com a plataforma Java •Trabalha na Betha Sistemas Ltds e instrutor na Código Efetivo •Membro do SouJava e GUJavaSC •Membro de projetos open-source como NetBeans entre outros •Já apresentou palestras no JavaOne, JustJava e The Developer's Conference 2
  • 3. Aplicando CDI em aplicações Java Agenda •Revisão rápida CDI •Recursos chave CDI •Aplicando na vida real ✓Demos •Q&A 3
  • 4. Aplicando CDI em aplicações Java Terminologia •JSR 299 - CDI ✓Contexts and Dependency Injection for the Java EE platform •Weld ✓JSR-299: Implementação de referência 4
  • 5. Aplicando CDI em aplicações Java “CDI is more than a framework. It's a whole, rich programming model. The theme of CDI is loose-coupling with strong typing.” Documentação do Weld 5
  • 6. Aplicando CDI em aplicações Java •Beans podem ser injetados utilizando @Inject Revisão rápida CDI 6 @Inject Greeting greeting;
  • 7. Aplicando CDI em aplicações Java •Beans podem ser injetados utilizando @Inject •Beans injetados pode ser filtrados ou resolvidos através do uso de qualificadores @Inject Greeting greeting; @Informal @Inject Greeting greeting; Revisão rápida CDI 7
  • 8. Aplicando CDI em aplicações Java Revisão rápida CDI •Beans podem ser nomeados utilizando @Named @Named(“pageModel”) public class PageModel { public getName() { ... } } <h:body> #{pageModel.name} </h:body> 8
  • 9. Aplicando CDI em aplicações Java •Beans com inicialização diferenciada podem ser construídos utilizando produtores public class Shop { @Produces PaymentProcessor getPaymentProcessor() { ... } @Produces List<Product> getProducts() { ... } } Revisão rápida CDI 9
  • 10. Aplicando CDI em aplicações Java •Beans com inicialização diferenciada podem ser construídos utilizando produtores public class Shop { @Produces @ApplicationScoped @Catalog @Named("catalog") List<Product> getProducts() { ... } } Revisão rápida CDI 10
  • 11. Aplicando CDI em aplicações Java Revisão rápida CDI •Ativação e configuração via arquivo beans.xml 11
  • 12. Aplicando CDI em aplicações Java Suporte a Java SE ● SeContainerInitializer é a api para configurar e inicializar um container CDI no Java SE. public static void main(String[] args) { SeContainer container = SeContainerInitializer.newInstance() .disableDiscovery() .addBeanClasses(MyService.class) .initialize(); MyService service = container.select(MyService.class).get(); service.sayHello(); container.close(); }
  • 13. Aplicando CDI em aplicações Java Suporte a Java SE ● Retorna um SeContainer o qual implementa Instance<Object> permitindo lookup programático public static void main(String[] args) { SeContainer container = SeContainerInitializer.newInstance() .disableDiscovery() .addBeanClasses(MyService.class) .initialize(); MyService service = container.select(MyService.class).get(); service.sayHello(); container.close(); }
  • 14. Aplicando CDI em aplicações Java Mas por que CDI? 14
  • 15. Aplicando CDI em aplicações Java Recursos chave CDI •Combinação de escopos •Sistema de eventos •AOP sem interfaces •Acesso ao ponto de injeção •Extensões (Portable extensions) Designing Java EE Applications in the Age of CDI 15
  • 16. Aplicando CDI em aplicações Java Combinação de escopos •Escopos determinam o ciclo de vida dos beans e podem ser combinados conforme necessário @ApplicationScoped public class System implements Serializable { @Inject User user; ... } @SessionScoped public class User implements Serializable { ... } 16
  • 17. Aplicando CDI em aplicações Java Escopos personalizados •Seam ✓RenderScoped •MyFaces CODI ✓@ConversationScoped ✓@WindowScoped ✓@ViewAccessScoped •Apache DeltaSpike ✓@TransactionScoped 17
  • 18. Aplicando CDI em aplicações Java @SessionScoped public class ShoppingCart implements Serializable { private User customer; @Inject public ShoppingCart(User customer) { this.customer = customer; } ... } Construtores de beans 18
  • 19. Aplicando CDI em aplicações Java @ConversationScoped public class Order { private Product product; private User customer; @Inject void setProduct(@Selected Product p) { this.product = p; } @Inject public void setCustomer(User customer) { this.customer = customer; } } Métodos inicializadores 19
  • 20. Aplicando CDI em aplicações Java •Sistema de eventos de baixo acoplamento public void afterDocumentUpdate( @Observes @Updated Document document) { ... } @Inject @Any Event<Document> event; ... public void someMethod() { event.fire(document); } Sistema de eventos 20
  • 21. Aplicando CDI em aplicações Java •Sistema de eventos de baixo acoplamento •Eventos podem ser filtrados utilizando qualificadores public void afterDocumentUpdate( @Observes @Updated Document document) { ... } public void onAnyDocumentEvent( @Observes Document document) { ... } @Inject @Updated Event<Document> event; ... public void someMethod() { event.fire(document); } Sistema de eventos 21
  • 22. Aplicando CDI em aplicações Java •Sistema de eventos de baixo acoplamento •Eventos podem ser filtrados utilizando qualificadores •Prioridades podem ser definidas com @Priority public void afterDocumentUpdate( @Observes @Priority(2) @Updated Document document) { ... } public void onAnyDocumentEvent( @Observes @Priority(1) Document document) { ... } Sistema de eventos 22
  • 23. Aplicando CDI em aplicações Java Sistema de eventos •Observadores condicionais ✓IF_EXISTS ✓ALWAYS public void afterDocumentUpdate( @Observes(receive=IF_EXISTS) @Updated Document document) { ... } 23
  • 24. Aplicando CDI em aplicações Java Sistema de eventos •Observadores transacionais ✓IN_PROGRESS, ✓BEFORE_COMPLETION, ✓AFTER_COMPLETION, ✓AFTER_FAILURE, ✓AFTER_SUCCESS public void afterDocumentUpdate( @Observes(during=AFTER_SUCCESS) @Updated Document document) { ... } 24
  • 25. Aplicando CDI em aplicações Java Sistema de eventos assíncronos •Eventos síncronos utilizam fire() e chamam apenas @Observes •Eventos síncronos utilizam o método fireAsync()e chamam apenas @ObservesAsync 25
  • 26. Aplicando CDI em aplicações Java AOP sem interfaces •Interceptadores desacoplam necessidades técnicas da lógica de negócio ✓Ortogonal à aplicação e sistema de tipos •Decoradores permitem que necessidades de negócio sejam compartimentalizadas utilizando o conceito de interceptadores ✓Anexado a um tipo Java, conhece a semântica do negócio •Configurável ✓Habilitado e ordenado via beans.xml 26
  • 27. Aplicando CDI em aplicações Java @Inherited @InterceptorBinding @Target({TYPE, METHOD}) @Retention(RUNTIME) public @interface Secure {} Interceptors 27
  • 28. Aplicando CDI em aplicações Java @Secure public class System { ... } public class ShoppingCart { @Secure public void placeOrder() { ... } } Interceptors 28
  • 29. Aplicando CDI em aplicações Java @Secure @Interceptor public class SecurityInterceptor { @AroundInvoke public Object manageSecurity( InvocationContext ctx) throws Exception { // manage security... ctx.proceed(); } } Interceptors 29
  • 30. Aplicando CDI em aplicações Java Decorators @Decorator class TimestampLogger implements Logger { @Inject @Delegate @Any Logger logger; void log(String message) { logger.log( timestamp() + ": " + message ); } ... } 30
  • 31. Aplicando CDI em aplicações Java Lookup programático ● Instance<Object> permite lookup programático de instâncias @Inject Intance<MyService> instances; ... public void someMethod() { MyService service = instances.select(MyService.class).get(); ... }
  • 32. Aplicando CDI em aplicações Java Acesso ao ponto de injeção (injection point) •Empodera os produtores com a capacidade de reagir de acordo com o ponto de injeção •Permitido para beans com escopo @Dependent para obter informações sobre os pontos de injeção o qual a invocação pertence 32
  • 33. Aplicando CDI em aplicações Java @Produces Logger createLogger(InjectionPoint ip) { return Logger.getLogger( ip.getMember().getDeclaringClass(). getName()); } Acesso ao ponto de injeção (injection point) 33
  • 34. Aplicando CDI em aplicações Java Extensões <T> void processAnnotatedType(@Observes final ProcessAnnotatedType<T> pat) { final AnnotatedTypeBuilder builder = new AnnotatedTypeBuilder(). readFromType(pat.getAnnotatedType(), true).addToClass(Model.INSTANCE); pat.setAnnotatedType(builder.create()); } 34
  • 35. Aplicando CDI em aplicações Java Extensões void beforeShutdown(@Observes BeforeShutdown bs, MBeanServer mbs, BeanDetailsController c) throws Exception { for (ObjectName objectName : c.getRegisteredObjectNames()) { mbs.unregisterMBean(objectName); } } 35
  • 36. Aplicando CDI em aplicações Java Extensões <X> void processInjectionTarget(@Observes ProcessInjectionTarget<X> pit) { for (InjectionPoint ip : pit.getInjectionTarget(). getInjectionPoints()) { ... } } 36
  • 37. Aplicando CDI em aplicações Java Named queries são validadas tardiamente 37
  • 38. Aplicando CDI em aplicações Java Named queries são validadas tardiamente 38
  • 39. Aplicando CDI em aplicações Java Named queries são validadas tardiamente 39
  • 40. Aplicando CDI em aplicações Java Typesafe @TypedQuery 40
  • 41. Aplicando CDI em aplicações Java Typesafe @TypedQuery ------------------------------------------------------------- COMPILATION ERROR : ------------------------------------------------------------- and returns false. model/CustomerModel.java:[47,25] error: Named query 'Customer.findByNme' not defined yet. model/CustomerModel.java:[43,25] error: Named query 'Customer.findAl' not defined yet. 2 errors ------------------------------------------------------------- 41
  • 42. Aplicando CDI em aplicações Java Demo 42
  • 43. Aplicando CDI em aplicações Java O que foi usado neste exemplo? •CDI ✓Injeção de dependência ✓Métodos produtores ✓Acesso ao injection point ✓Seleção programática de instância via qualifier •Annotation processors 43
  • 44. Aplicando CDI em aplicações Java Referências ● CDI Spec ○ http://cdi-spec.org/ ● Wildfly Swarm ○ http://wildfly-swarm.io/ ● Deltaspike ○ https://deltaspike.apache.org/ ● Weld ○ http://weld.cdi-spec.org/
  • 45. Aplicando CDI em aplicações Java Q&A Michel Graciano | @mgraciano https://github.com/mgraciano/javanoroeste-cdi-2018 45