SlideShare a Scribd company logo
CDI Portable Extensions
Czyli jak zręcznie manipulować beanami



                              Adam Warski   @adamwarski
Kim jestem?

¤  Adam Warski

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

¤  Autor Hibernate Envers

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

¤  Wstęp do CDI

¤  Wstęp do Portable Extensions

¤  Demo

¤  Real-life
CDI

¤  Contexts & Dependency Injection

¤  JEE6

¤  @Inject!

¤  Wiele innych adnotacji

¤  Dużo punktów rozszerzeń
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!”;!
            !}!
   }!
Zasięgi (Scopes)

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

¤  Poza tym: 
    ¤  @RequestScoped!
    ¤  @ConversationScoped!
    ¤  @SessionScoped!
    ¤  @ApplicationScoped!
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ć
CDI Portable Extensions
Portable Extensions

¤  Przetwarza wszystkie beany w aplikacji

¤  .jar musi zawierać plik

javax.enterprise.inject.spi.Extension

z nazwą rozszerzenia (Java ServiceLoader)
Demo

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

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

¤  Open-source

¤  Wykorzystywane przez nas produkcyjnie

¤  Wystarczy dodać zależność w pomie
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() { … }!
            }!
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 {}!
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);!
            }!
        }!
Real-life #2

           Auto-factories
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) { … }!
!
    …!
}!
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();!
          // …!
      }!
  }!
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
Linki

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

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

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

¤  http://seamframework.org/Weld
Dziękuje! Pytania?

¤  adam@warski.org

¤  @adamwarski

More Related Content

PDF
Wprowadzenie do PHPUnit
PPTX
PDF
Daj się wyręczyć - Joomla Day Polska 2014
PDF
RxJS okiem doświadczonego inżyniera - Angular Warsaw #13
PDF
Wielomodułowe aplikacje korzystające ze wspólnej bazy kodu [PL]
PDF
Meet.js 2016/02/01 - What's new in Typescript
PPTX
Środowisko testowe pod REST-a
PDF
Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013
Wprowadzenie do PHPUnit
Daj się wyręczyć - Joomla Day Polska 2014
RxJS okiem doświadczonego inżyniera - Angular Warsaw #13
Wielomodułowe aplikacje korzystające ze wspólnej bazy kodu [PL]
Meet.js 2016/02/01 - What's new in Typescript
Środowisko testowe pod REST-a
Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013

Viewers also liked (20)

PPTX
Power point flip jgg
PPT
Slideshare
PPS
Real madrid 2628
PDF
Presentació photoshop
PPSX
Relatório da caminhada da pastoral familiar diocese regional
PPT
Pierre topet
PPTX
Album photo
DOC
Decreto nº 9.482 institui o pmi
PDF
Regulamento academia verao cup
PPT
Presentació META
PDF
Resolucao see-no-1812-2011
PPT
Imagens da capela dos ossos em évora
PPTX
Presentación1 de juan
PPT
Poemas
PDF
Instrucciones de crypsec crypto security - encriptador
PDF
Curso de idiomas globo inglês livro009
PDF
O Design nas Pequenas e Médias Empresas (PME's)
PPT
Apresentação fórum superintendente
PPTX
Duendes
PPT
Titanium勉強会
Power point flip jgg
Slideshare
Real madrid 2628
Presentació photoshop
Relatório da caminhada da pastoral familiar diocese regional
Pierre topet
Album photo
Decreto nº 9.482 institui o pmi
Regulamento academia verao cup
Presentació META
Resolucao see-no-1812-2011
Imagens da capela dos ossos em évora
Presentación1 de juan
Poemas
Instrucciones de crypsec crypto security - encriptador
Curso de idiomas globo inglês livro009
O Design nas Pequenas e Médias Empresas (PME's)
Apresentação fórum superintendente
Duendes
Titanium勉強会
Ad

Similar to CDI Portable Extensions (20)

PPTX
Jak stworzyć udany system informatyczny
PPT
Google Web Toolkit
PDF
JavaScript, Moduły
PDF
ITAD PolSl 2014 - Nowości w .NET 2015
PDF
Hyperion - wystarczy jeden shake
PDF
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
PDF
4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...
PPTX
Iron Python I Dlr
PDF
Praktyczne code reviews - PHPConPl
PPTX
Zabezpiecz swoją stronę w Joomla!
PPTX
Jak zostać mobile deweloperem w 1 dzień
PPTX
Exam: 70-511 Enhancing Usability - Windows Application
PPTX
JDD 2016 - Wojciech Oczkowski - Testowanie Wydajnosci Za Pomoca Narzedzia JMH
PDF
Integracja środowiska testowego z użyciem Robot Framework, TrojQA 2014-12-16
PDF
Prostota i mozliwosci symfony2
PDF
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
PPTX
Using Red Gate SQL Doc for database documentation
PDF
Zastosowanie buildout przy wdrażaniu projektów opartych o framework Django
PDF
Functional widgets in Rails
PDF
JSON, REST API
Jak stworzyć udany system informatyczny
Google Web Toolkit
JavaScript, Moduły
ITAD PolSl 2014 - Nowości w .NET 2015
Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...
Iron Python I Dlr
Praktyczne code reviews - PHPConPl
Zabezpiecz swoją stronę w Joomla!
Jak zostać mobile deweloperem w 1 dzień
Exam: 70-511 Enhancing Usability - Windows Application
JDD 2016 - Wojciech Oczkowski - Testowanie Wydajnosci Za Pomoca Narzedzia JMH
Integracja środowiska testowego z użyciem Robot Framework, TrojQA 2014-12-16
Prostota i mozliwosci symfony2
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
Using Red Gate SQL Doc for database documentation
Zastosowanie buildout przy wdrażaniu projektów opartych o framework Django
Functional widgets in Rails
JSON, REST API
Ad

More from Adam Warski (9)

PDF
What have the annotations done to us?
PPT
Hejdyk maleńka część mazur
PDF
Slick eventsourcing
PDF
Evaluating persistent, replicated message queues
PDF
The no-framework Scala Dependency Injection Framework
PDF
ElasticMQ: a fully asynchronous, Akka-based SQS server
PDF
The ideal module system and the harsh reality
PDF
Recommendation systems with Mahout: introduction
PDF
Scala Macros
What have the annotations done to us?
Hejdyk maleńka część mazur
Slick eventsourcing
Evaluating persistent, replicated message queues
The no-framework Scala Dependency Injection Framework
ElasticMQ: a fully asynchronous, Akka-based SQS server
The ideal module system and the harsh reality
Recommendation systems with Mahout: introduction
Scala Macros

CDI Portable Extensions

  • 1. CDI Portable Extensions Czyli jak zręcznie manipulować beanami Adam Warski @adamwarski
  • 2. Kim jestem? ¤  Adam Warski ¤  Współzałożyciel SoftwareMill ¤  Niestandardowe Oprogramowanie w Standardzie ¤  Autor Hibernate Envers ¤  http://www.warski.org/blog
  • 3. Agenda ¤  Wstęp do CDI ¤  Wstęp do Portable Extensions ¤  Demo ¤  Real-life
  • 4. CDI ¤  Contexts & Dependency Injection ¤  JEE6 ¤  @Inject! ¤  Wiele innych adnotacji ¤  Dużo punktów rozszerzeń
  • 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. Zasięgi (Scopes) ¤  Domyślny: dependent (brak adnotacji, ew. @Dependent)! ¤  Poza tym: ¤  @RequestScoped! ¤  @ConversationScoped! ¤  @SessionScoped! ¤  @ApplicationScoped!
  • 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ć
  • 9. Portable Extensions ¤  Przetwarza wszystkie beany w aplikacji ¤  .jar musi zawierać plik javax.enterprise.inject.spi.Extension z nazwą rozszerzenia (Java ServiceLoader)
  • 10. Demo ¤  Cały kod dostępny na GitHubie! ¤  https://github.com/adamw/portable-extensions-demo
  • 11. Real-life ¤  Rozszerzenia dostępne na ¤  https://github.com/softwaremill/softwaremill-common ¤  Open-source ¤  Wykorzystywane przez nas produkcyjnie ¤  Wystarczy dodać zależność w pomie
  • 12. 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() { … }! }!
  • 13. 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 {}!
  • 14. 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);! }! }!
  • 15. Real-life #2 Auto-factories 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) { … }! ! …! }!
  • 16. 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();! // …! }! }!
  • 17. 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