SlideShare uma empresa Scribd logo
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

PDF
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
PDF
Testes em aplicações JEE: Montando sua infra de testes automatizados
ODP
Dojo de programação - Dia de Java - UFSCar
PPTX
Java CDI: Usando Java CDI em projetos Jakarta EE ou Microprofile
PDF
[Java] Contexts and Dependency Injection em JEE6
PDF
CDI -Contextos e Dependências
PDF
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
PDF
TDC2012: Explorando os conceitos básicos da API de CDI do Java EE 6
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Testes em aplicações JEE: Montando sua infra de testes automatizados
Dojo de programação - Dia de Java - UFSCar
Java CDI: Usando Java CDI em projetos Jakarta EE ou Microprofile
[Java] Contexts and Dependency Injection em JEE6
CDI -Contextos e Dependências
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
TDC2012: Explorando os conceitos básicos da API de CDI do Java EE 6

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

ODP
Introdução a CDI e como utilizá-la em aplicações reais
PDF
GUJavaSC - Mini-curso Java EE
PPT
Java Micro Edition
PDF
Introdução a Programação de Dispositivos Móveis
PDF
Serra StarTec 2013 - Java EE
PDF
Java para dispositivos móveis
PDF
Palest"Tecnologias para Desenvolvimento Baseado em Componentes"
PDF
Aplicativos Moveis Com J2ME
PDF
GUJavaSC - Combinando AngularJS com Java EE
PDF
J530 3 jndi
PDF
CDI Extensions e DeltaSpike
PDF
QCon 2015 - Combinando AngularJS com Java EE
PPTX
Do Seam à CDI (JSR-299)
PDF
20070131 mgjug-enterprise java-me_netbeans_mp_nokia_juarez_junior
PPTX
Uso de Critérios de Seleção para Frameworks Livres em Plataforma Java EE
PDF
Repensando padrões e boas práticas java ee
PDF
Spring e Injeção de Dependência
PPTX
CDI - Unindo Seam, Spring e Guice
PDF
Java OO Middleware - JEE / EJB / RMI
Introdução a CDI e como utilizá-la em aplicações reais
GUJavaSC - Mini-curso Java EE
Java Micro Edition
Introdução a Programação de Dispositivos Móveis
Serra StarTec 2013 - Java EE
Java para dispositivos móveis
Palest"Tecnologias para Desenvolvimento Baseado em Componentes"
Aplicativos Moveis Com J2ME
GUJavaSC - Combinando AngularJS com Java EE
J530 3 jndi
CDI Extensions e DeltaSpike
QCon 2015 - Combinando AngularJS com Java EE
Do Seam à CDI (JSR-299)
20070131 mgjug-enterprise java-me_netbeans_mp_nokia_juarez_junior
Uso de Critérios de Seleção para Frameworks Livres em Plataforma Java EE
Repensando padrões e boas práticas java ee
Spring e Injeção de Dependência
CDI - Unindo Seam, Spring e Guice
Java OO Middleware - JEE / EJB / RMI
Anúncio

Mais de Michel Graciano (6)

PDF
O papel e a carreira de um desenvolvedor de software
PDF
Finalmente java sabe trabalhar com data e hora (gu java sc)
PDF
CON6423: Scalable JavaScript applications with Project Nashorn
PDF
Finalmente java sabe trabalhar com data e hora
PDF
Designing Java EE Applications in the Age of CDI
ODP
genesis - Acelerando o desenvolvimento de aplicações desktop
O papel e a carreira de um desenvolvedor de software
Finalmente java sabe trabalhar com data e hora (gu java sc)
CON6423: Scalable JavaScript applications with Project Nashorn
Finalmente java sabe trabalhar com data e hora
Designing Java EE Applications in the Age of CDI
genesis - Acelerando o desenvolvimento de aplicações desktop
Anúncio

Último (20)

PPTX
Fund-proc-moagem-carvaoerde_PPT_v007.pptx
PDF
PROJETO DE PESQUISA PRONTO BIOMEDICINA 2025 ABNT.pdf
PDF
Boas práticas em rebobinamento trifásico .pdf
PPTX
TREINAMENTO DE NORMA REGULAMENTADORA NR2
PPT
DIFERENTES TIPOS DE SOLO NA AGRICULTURA.
PPT
NR 18 Condições e Meio Ambiente de Trabalho na Indústria da Construção.ppt
PPTX
Apresentação de brainstorm geométrica colorida.pptx
PPT
1 - Introdução a disciplina ciencia o solo.ppt
PDF
TBSSMA_Tubarão_05_10_20 - SSMA.......pdf
PDF
Normas, higiene e segurança na soldadura eléctrica
PPT
Diagrama de fases de los aceros como material
PPTX
Portfólio Dexo Recursos Humanos docosia
PPTX
11 Métodos de prevenção individual e coletiva.pptx
PDF
Projecto Fotovoltaico de um sistema de abastecimento de agua
PDF
ANTENA DIPOLO DOBRADO NOTA AULA 164 PROFESSOR ANGELO ANTONIO LEITHOLD.pdf
PPTX
Introdução à Agronomia - Profissionais x Desafios de Mercado x Agricultura
PPT
Aula_2_Atomo distribuiçao eletronica.ppt
PPTX
Introdução à Agronomia - 5 fatos sobre a agronomia
PPTX
Treinamento NR-18 - Canteiro de obras.pptx
PPTX
TR_Seguranca em Elevadores de Obras.pptx
Fund-proc-moagem-carvaoerde_PPT_v007.pptx
PROJETO DE PESQUISA PRONTO BIOMEDICINA 2025 ABNT.pdf
Boas práticas em rebobinamento trifásico .pdf
TREINAMENTO DE NORMA REGULAMENTADORA NR2
DIFERENTES TIPOS DE SOLO NA AGRICULTURA.
NR 18 Condições e Meio Ambiente de Trabalho na Indústria da Construção.ppt
Apresentação de brainstorm geométrica colorida.pptx
1 - Introdução a disciplina ciencia o solo.ppt
TBSSMA_Tubarão_05_10_20 - SSMA.......pdf
Normas, higiene e segurança na soldadura eléctrica
Diagrama de fases de los aceros como material
Portfólio Dexo Recursos Humanos docosia
11 Métodos de prevenção individual e coletiva.pptx
Projecto Fotovoltaico de um sistema de abastecimento de agua
ANTENA DIPOLO DOBRADO NOTA AULA 164 PROFESSOR ANGELO ANTONIO LEITHOLD.pdf
Introdução à Agronomia - Profissionais x Desafios de Mercado x Agricultura
Aula_2_Atomo distribuiçao eletronica.ppt
Introdução à Agronomia - 5 fatos sobre a agronomia
Treinamento NR-18 - Canteiro de obras.pptx
TR_Seguranca em Elevadores de Obras.pptx

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