O documento discute a aplicação de CDI (Contexts and Dependency Injection) em aplicações Java. Ele começa com uma breve revisão dos principais recursos do CDI como injeção de dependência, escopos, sistema de eventos e interceptadores. Em seguida, demonstra como esses recursos podem ser aplicados na prática através de exemplos de código. Finalmente, discute brevemente extensões CDI e validação de consultas nomeadas.
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();
}
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
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
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
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
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