CDI Portable Extensions

1,856 views

Published on

Presentation from Confitura 2011 on CDI Portable Extensions

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,856
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

×