Download - CDI Portable Extensions

Transcript
Page 1: CDI Portable Extensions

CDI Portable Extensions Czyli jak zręcznie manipulować beanami

Adam Warski @adamwarski

Page 2: CDI Portable Extensions

Kim jestem?

¤  Adam Warski

¤  Współzałożyciel SoftwareMill ¤  Niestandardowe Oprogramowanie w Standardzie

¤  Autor Hibernate Envers

¤  http://www.warski.org/blog

Page 3: CDI Portable Extensions

Agenda

¤  Wstęp do CDI

¤  Wstęp do Portable Extensions

¤  Demo

¤  Real-life

Page 4: CDI Portable Extensions

CDI

¤  Contexts & Dependency Injection

¤  JEE6

¤  @Inject!

¤  Wiele innych adnotacji

¤  Dużo punktów rozszerzeń

Page 5: CDI Portable Extensions

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!”;!!}!

}!

Page 6: CDI Portable Extensions

Zasięgi (Scopes)

¤  Domyślny: dependent (brak adnotacji, ew. @Dependent)!

¤  Poza tym: ¤  @RequestScoped!¤  @ConversationScoped!¤  @SessionScoped!¤  @ApplicationScoped!

Page 7: CDI Portable Extensions

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ć

Page 8: CDI Portable Extensions
Page 9: CDI Portable Extensions

Portable Extensions

¤  Przetwarza wszystkie beany w aplikacji

¤  .jar musi zawierać plik

javax.enterprise.inject.spi.Extension

z nazwą rozszerzenia (Java ServiceLoader)

Page 10: CDI Portable Extensions

Demo

¤  Cały kod dostępny na GitHubie! ¤  https://github.com/adamw/portable-extensions-demo

Page 11: CDI Portable Extensions

Real-life

¤  Rozszerzenia dostępne na ¤  https://github.com/softwaremill/softwaremill-common

¤  Open-source

¤  Wykorzystywane przez nas produkcyjnie

¤  Wystarczy dodać zależność w pomie

Page 12: CDI Portable Extensions

Stackable Security Interceptors

¤  Dodaje security interceptor sprawdzający „sumę” warunków określonych na metodzie/klasie

Real-life #1

@MustBeLoggedIn!public class ProductManager {!

!public Product read (int id) { … }!!

!@MustBeAdministrator!!public void deleteAll() { … }!

}!

Page 13: CDI Portable Extensions

Stackable Security Interceptors

¤  Meta-adnotacja definiuje warunek logiczny, który powinien być sprawdzony

Real-life #1

@Target({TYPE, METHOD })!@Retention(RUNTIME)!@SecureBinding!@Secure(“#{user.administrator == true}”)!public @interface MustBeAdministrator {}!

Page 14: CDI Portable Extensions

Auto-factories

¤  Dynamiczne tworzenie beanów

¤  Analogiczne do assisted inject w Guice

Real-life #2

public interface PriceCalculator {! int getFinalPrice(); !! interface Factory {! PriceCalculator create(Product product);! }!}!

Page 15: CDI Portable Extensions

Auto-factories

Real-life #2

public 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) { … }!

! …!}!

Page 16: CDI Portable Extensions

Auto-factories

¤  Możemy wstrzyknąć fabrykę bez konieczności jej pisania!

Real-life #2

public class User {! @Inject! PriceCalculator.Factory priceCalculatorFactory;!! void buy(Product product) {! int price = priceCalculatorFactory!

! !.create(product)!! !.getFinalPrice();!

// …! }!}!

Page 17: CDI Portable Extensions

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

Real-life #3

Page 18: CDI Portable Extensions

Linki

¤  https://github.com/adamw/portable-extensions-demo

¤  https://github.com/softwaremill/softwaremill-common

¤  http://www.jboss.org/arquillian

¤  http://seamframework.org/Weld

Page 19: CDI Portable Extensions

Dziękuje! Pytania?

¤  [email protected]

¤  @adamwarski