CDI Portable Extensions
-
Upload
adam-warski -
Category
Documents
-
view
1.799 -
download
0
description
Transcript of CDI Portable Extensions
![Page 1: CDI Portable Extensions](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/1.jpg)
CDI Portable Extensions Czyli jak zręcznie manipulować beanami
Adam Warski @adamwarski
![Page 2: CDI Portable Extensions](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/2.jpg)
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](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/3.jpg)
Agenda
¤ Wstęp do CDI
¤ Wstęp do Portable Extensions
¤ Demo
¤ Real-life
![Page 4: CDI Portable Extensions](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/4.jpg)
CDI
¤ Contexts & Dependency Injection
¤ JEE6
¤ @Inject!
¤ Wiele innych adnotacji
¤ Dużo punktów rozszerzeń
![Page 5: CDI Portable Extensions](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/5.jpg)
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](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/6.jpg)
Zasięgi (Scopes)
¤ Domyślny: dependent (brak adnotacji, ew. @Dependent)!
¤ Poza tym: ¤ @RequestScoped!¤ @ConversationScoped!¤ @SessionScoped!¤ @ApplicationScoped!
![Page 7: CDI Portable Extensions](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/7.jpg)
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](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/8.jpg)
![Page 9: CDI Portable Extensions](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/9.jpg)
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](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/10.jpg)
Demo
¤ Cały kod dostępny na GitHubie! ¤ https://github.com/adamw/portable-extensions-demo
![Page 11: CDI Portable Extensions](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/11.jpg)
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](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/12.jpg)
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](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/13.jpg)
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](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/14.jpg)
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](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/15.jpg)
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](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/16.jpg)
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](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/17.jpg)
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](https://reader036.fdocuments.pl/reader036/viewer/2022081907/54816e80b4795950578b48e6/html5/thumbnails/18.jpg)
Linki
¤ https://github.com/adamw/portable-extensions-demo
¤ https://github.com/softwaremill/softwaremill-common
¤ http://www.jboss.org/arquillian
¤ http://seamframework.org/Weld