SlideShare a Scribd company logo
1 of 19
Download to read offline
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ć
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

Viewers also liked

Power point flip jgg
Power point flip jggPower point flip jgg
Power point flip jggyunquey
 
Real madrid 2628
Real madrid 2628Real madrid 2628
Real madrid 2628Mario Maya
 
Presentació photoshop
Presentació photoshopPresentació photoshop
Presentació photoshoplagb2
 
Relatório da caminhada da pastoral familiar diocese regional
Relatório da caminhada da pastoral familiar diocese regionalRelatório da caminhada da pastoral familiar diocese regional
Relatório da caminhada da pastoral familiar diocese regionalfamiliaregsul4
 
Pierre topet
Pierre topetPierre topet
Pierre topetaeziah
 
Album photo
Album photoAlbum photo
Album photosamsblog
 
Decreto nº 9.482 institui o pmi
Decreto nº 9.482 institui o pmiDecreto nº 9.482 institui o pmi
Decreto nº 9.482 institui o pmiCarlos França
 
Regulamento academia verao cup
Regulamento academia verao cupRegulamento academia verao cup
Regulamento academia verao cupcaxana
 
Presentació META
Presentació METAPresentació META
Presentació METAxaviserra
 
Imagens da capela dos ossos em évora
Imagens da capela dos ossos em évora Imagens da capela dos ossos em évora
Imagens da capela dos ossos em évora mmmclementina
 
Presentación1 de juan
Presentación1 de juanPresentación1 de juan
Presentación1 de juancompert
 
Instrucciones de crypsec crypto security - encriptador
Instrucciones de crypsec   crypto security - encriptadorInstrucciones de crypsec   crypto security - encriptador
Instrucciones de crypsec crypto security - encriptadorVirilito
 
Curso de idiomas globo inglês livro009
Curso de idiomas globo inglês livro009 Curso de idiomas globo inglês livro009
Curso de idiomas globo inglês livro009 rosemere12
 
O Design nas Pequenas e Médias Empresas (PME's)
O Design nas Pequenas e Médias Empresas (PME's)O Design nas Pequenas e Médias Empresas (PME's)
O Design nas Pequenas e Médias Empresas (PME's)Vicente Carvalho
 
Apresentação fórum superintendente
Apresentação fórum  superintendenteApresentação fórum  superintendente
Apresentação fórum superintendentemarconiperillo_equipe
 
Titanium勉強会
Titanium勉強会Titanium勉強会
Titanium勉強会Yusuke Kita
 

Viewers also liked (20)

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

Similar to CDI Portable Extensions

Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyqbeuek
 
Google Web Toolkit
Google Web ToolkitGoogle Web Toolkit
Google Web Toolkitbartosz_w
 
ITAD PolSl 2014 - Nowości w .NET 2015
ITAD PolSl 2014 - Nowości w .NET 2015ITAD PolSl 2014 - Nowości w .NET 2015
ITAD PolSl 2014 - Nowości w .NET 2015Michał Dudak
 
Hyperion - wystarczy jeden shake
Hyperion - wystarczy jeden shakeHyperion - wystarczy jeden shake
Hyperion - wystarczy jeden shakekraqa
 
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shakeFuture Processing
 
4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...
4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...
4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...PROIDEA
 
Praktyczne code reviews - PHPConPl
Praktyczne code reviews - PHPConPlPraktyczne code reviews - PHPConPl
Praktyczne code reviews - PHPConPlSebastian Marek
 
Zabezpiecz swoją stronę w Joomla!
Zabezpiecz swoją stronę w Joomla!Zabezpiecz swoją stronę w Joomla!
Zabezpiecz swoją stronę w Joomla!Wojciech Klocek
 
Jak zostać mobile deweloperem w 1 dzień
Jak zostać mobile deweloperem w 1 dzieńJak zostać mobile deweloperem w 1 dzień
Jak zostać mobile deweloperem w 1 dzieńPaweł Kondraciuk
 
Exam: 70-511 Enhancing Usability - Windows Application
Exam: 70-511 Enhancing Usability - Windows ApplicationExam: 70-511 Enhancing Usability - Windows Application
Exam: 70-511 Enhancing Usability - Windows ApplicationMaciej Zbrzezny
 
JDD 2016 - Wojciech Oczkowski - Testowanie Wydajnosci Za Pomoca Narzedzia JMH
JDD 2016 - Wojciech Oczkowski - Testowanie Wydajnosci Za Pomoca Narzedzia JMHJDD 2016 - Wojciech Oczkowski - Testowanie Wydajnosci Za Pomoca Narzedzia JMH
JDD 2016 - Wojciech Oczkowski - Testowanie Wydajnosci Za Pomoca Narzedzia JMHPROIDEA
 
Integracja środowiska testowego z użyciem Robot Framework, TrojQA 2014-12-16
Integracja środowiska testowego z użyciem Robot Framework, TrojQA 2014-12-16Integracja środowiska testowego z użyciem Robot Framework, TrojQA 2014-12-16
Integracja środowiska testowego z użyciem Robot Framework, TrojQA 2014-12-16Krzysztof Synak
 
Prostota i mozliwosci symfony2
Prostota i mozliwosci symfony2Prostota i mozliwosci symfony2
Prostota i mozliwosci symfony2Natalia Stanko
 
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPJak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPPiotr Horzycki
 
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationMariusz Koprowski
 
Zastosowanie buildout przy wdrażaniu projektów opartych o framework Django
Zastosowanie buildout przy wdrażaniu projektów opartych o framework DjangoZastosowanie buildout przy wdrażaniu projektów opartych o framework Django
Zastosowanie buildout przy wdrażaniu projektów opartych o framework DjangoDominik Szopa
 
Functional widgets in Rails
Functional widgets in RailsFunctional widgets in Rails
Functional widgets in RailsSebastian Sito
 
JSON, REST API
JSON, REST APIJSON, REST API
JSON, REST API3camp
 

Similar to CDI Portable Extensions (20)

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

More from Adam Warski

What have the annotations done to us?
What have the annotations done to us?What have the annotations done to us?
What have the annotations done to us?Adam Warski
 
Hejdyk maleńka część mazur
Hejdyk maleńka część mazurHejdyk maleńka część mazur
Hejdyk maleńka część mazurAdam Warski
 
Slick eventsourcing
Slick eventsourcingSlick eventsourcing
Slick eventsourcingAdam Warski
 
Evaluating persistent, replicated message queues
Evaluating persistent, replicated message queuesEvaluating persistent, replicated message queues
Evaluating persistent, replicated message queuesAdam Warski
 
The no-framework Scala Dependency Injection Framework
The no-framework Scala Dependency Injection FrameworkThe no-framework Scala Dependency Injection Framework
The no-framework Scala Dependency Injection FrameworkAdam Warski
 
ElasticMQ: a fully asynchronous, Akka-based SQS server
ElasticMQ: a fully asynchronous, Akka-based SQS serverElasticMQ: a fully asynchronous, Akka-based SQS server
ElasticMQ: a fully asynchronous, Akka-based SQS serverAdam Warski
 
The ideal module system and the harsh reality
The ideal module system and the harsh realityThe ideal module system and the harsh reality
The ideal module system and the harsh realityAdam Warski
 
Recommendation systems with Mahout: introduction
Recommendation systems with Mahout: introductionRecommendation systems with Mahout: introduction
Recommendation systems with Mahout: introductionAdam Warski
 

More from Adam Warski (9)

What have the annotations done to us?
What have the annotations done to us?What have the annotations done to us?
What have the annotations done to us?
 
Hejdyk maleńka część mazur
Hejdyk maleńka część mazurHejdyk maleńka część mazur
Hejdyk maleńka część mazur
 
Slick eventsourcing
Slick eventsourcingSlick eventsourcing
Slick eventsourcing
 
Evaluating persistent, replicated message queues
Evaluating persistent, replicated message queuesEvaluating persistent, replicated message queues
Evaluating persistent, replicated message queues
 
The no-framework Scala Dependency Injection Framework
The no-framework Scala Dependency Injection FrameworkThe no-framework Scala Dependency Injection Framework
The no-framework Scala Dependency Injection Framework
 
ElasticMQ: a fully asynchronous, Akka-based SQS server
ElasticMQ: a fully asynchronous, Akka-based SQS serverElasticMQ: a fully asynchronous, Akka-based SQS server
ElasticMQ: a fully asynchronous, Akka-based SQS server
 
The ideal module system and the harsh reality
The ideal module system and the harsh realityThe ideal module system and the harsh reality
The ideal module system and the harsh reality
 
Recommendation systems with Mahout: introduction
Recommendation systems with Mahout: introductionRecommendation systems with Mahout: introduction
Recommendation systems with Mahout: introduction
 
Scala Macros
Scala MacrosScala Macros
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ć
  • 8.
  • 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