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.

CDI Portable Extensions

1,930 views

Published on

Presentation from Confitura 2011 on CDI Portable Extensions

  • Be the first to comment

  • Be the first to like this

CDI Portable Extensions

  1. 1. CDI Portable ExtensionsCzyli jak zręcznie manipulować beanami Adam Warski @adamwarski
  2. 2. Kim jestem?¤  Adam Warski¤  Współzałożyciel SoftwareMill ¤  Niestandardowe Oprogramowanie w Standardzie¤  Autor Hibernate Envers¤  http://www.warski.org/blog
  3. 3. Agenda¤  Wstęp do CDI¤  Wstęp do Portable Extensions¤  Demo¤  Real-life
  4. 4. CDI¤  Contexts & Dependency Injection¤  JEE6¤  @Inject!¤  Wiele innych adnotacji¤  Dużo punktów rozszerzeń
  5. 5. Bean¤  Każda klasa: ¤  Z domyślnym konstruktorem ¤  Z konstruktorem z adnotacją @Inject!¤  W archiwum (.jar) musi znajdować się beans.xml!¤  Np.: public class HelloWorld {! !public String sayHello() {! ! !return “Hello World!”;! !}! }!
  6. 6. Zasięgi (Scopes)¤  Domyślny: dependent (brak adnotacji, ew. @Dependent)!¤  Poza tym: ¤  @RequestScoped! ¤  @ConversationScoped! ¤  @SessionScoped! ¤  @ApplicationScoped!
  7. 7. Portable Extensions¤  API¤  Wpływają na proces tworzenia beanów¤  Działają z każdą implementacją CDI¤  Seria eventów, które możemy obserwować
  8. 8. Portable Extensions¤  Przetwarza wszystkie beany w aplikacji¤  .jar musi zawierać plikjavax.enterprise.inject.spi.Extensionz nazwą rozszerzenia (Java ServiceLoader)
  9. 9. Demo¤  Cały kod dostępny na GitHubie! ¤  https://github.com/adamw/portable-extensions-demo
  10. 10. Real-life¤  Rozszerzenia dostępne na ¤  https://github.com/softwaremill/softwaremill-common¤  Open-source¤  Wykorzystywane przez nas produkcyjnie¤  Wystarczy dodać zależność w pomie
  11. 11. Real-life #1 Stackable Security Interceptors ¤  Dodaje security interceptor sprawdzający „sumę” warunków określonych na metodzie/klasie @MustBeLoggedIn! public class ProductManager {! !public Product read (int id) { … }! ! !@MustBeAdministrator! !public void deleteAll() { … }! }!
  12. 12. Real-life #1 Stackable Security Interceptors ¤  Meta-adnotacja definiuje warunek logiczny, który powinien być sprawdzony @Target({TYPE, METHOD })! @Retention(RUNTIME)! @SecureBinding! @Secure(“#{user.administrator == true}”)! public @interface MustBeAdministrator {}!
  13. 13. Real-life #2 Auto-factories ¤  Dynamiczne tworzenie beanów ¤  Analogiczne do assisted inject w Guice public interface PriceCalculator {! int getFinalPrice(); ! ! interface Factory {! PriceCalculator create(Product product);! }! }!
  14. 14. Real-life #2 Auto-factoriespublic interface PriceCalculator {! int getFinalPrice(); !! interface Factory {! PriceCalculator create(Product product);! }!}!@CreatedWith(PriceCalculator.Factory.class)!public class PriceCalculatorImpl implements PriceCalculator {! @Inject! public PriceCalculatorImpl(! !@FactoryParameter Product product,! !Discounts discounts) { … }!! …!}!
  15. 15. Real-life #2 Auto-factories ¤  Możemy wstrzyknąć fabrykę bez konieczności jej pisania! public class User {! @Inject! PriceCalculator.Factory priceCalculatorFactory;! ! void buy(Product product) {! int price = priceCalculatorFactory! ! !.create(product)! ! !.getFinalPrice();! // …! }! }!
  16. 16. Real-life #3 AOP++ ¤  AOP pozwala dodać interceptor na podstawie sygnatury ¤  Z Portable Extensions: dodatkowe możliwości ¤  „Dynamiczny AOP” ¤  na podstawie pliku konfiguracyjnego ¤  dowolna logika (w Javie, nie XMLu!) ¤  np. dodanie timing interceptora do konkretnych beanów
  17. 17. Linki¤  https://github.com/adamw/portable-extensions-demo¤  https://github.com/softwaremill/softwaremill-common¤  http://www.jboss.org/arquillian¤  http://seamframework.org/Weld
  18. 18. Dziękuje! Pytania?¤  adam@warski.org¤  @adamwarski

×