Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Aplicando CDI em aplicações Java

126 views

Published on

Aplicando CDI em aplicações Java

Published in: Engineering
  • Be the first to like this

Aplicando CDI em aplicações Java

  1. 1. Aplicando CDI em aplicações Java Michel Graciano
  2. 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. 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. 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. 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. 6. Aplicando CDI em aplicações Java •Beans podem ser injetados utilizando @Inject Revisão rápida CDI 6 @Inject Greeting greeting;
  7. 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. 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. 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. 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. 11. Aplicando CDI em aplicações Java Revisão rápida CDI •Ativação e configuração via arquivo beans.xml 11
  12. 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. 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. 14. Aplicando CDI em aplicações Java Mas por que CDI? 14
  15. 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. 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. 17. Aplicando CDI em aplicações Java Escopos personalizados •Seam ✓RenderScoped •MyFaces CODI ✓@ConversationScoped ✓@WindowScoped ✓@ViewAccessScoped •Apache DeltaSpike ✓@TransactionScoped 17
  18. 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. 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. 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. 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. 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. 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. 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. 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. 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. 27. Aplicando CDI em aplicações Java @Inherited @InterceptorBinding @Target({TYPE, METHOD}) @Retention(RUNTIME) public @interface Secure {} Interceptors 27
  28. 28. Aplicando CDI em aplicações Java @Secure public class System { ... } public class ShoppingCart { @Secure public void placeOrder() { ... } } Interceptors 28
  29. 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. 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. 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. 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. 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. 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. 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. 36. Aplicando CDI em aplicações Java Extensões <X> void processInjectionTarget(@Observes ProcessInjectionTarget<X> pit) { for (InjectionPoint ip : pit.getInjectionTarget(). getInjectionPoints()) { ... } } 36
  37. 37. Aplicando CDI em aplicações Java Named queries são validadas tardiamente 37
  38. 38. Aplicando CDI em aplicações Java Named queries são validadas tardiamente 38
  39. 39. Aplicando CDI em aplicações Java Named queries são validadas tardiamente 39
  40. 40. Aplicando CDI em aplicações Java Typesafe @TypedQuery 40
  41. 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. 42. Aplicando CDI em aplicações Java Demo 42
  43. 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. 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. 45. Aplicando CDI em aplicações Java Q&A Michel Graciano | @mgraciano https://github.com/mgraciano/javanoroeste-cdi-2018 45

×