SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Freundliche Eindringlinge

        Moderne Web-Applikationen mit CDI
Norman Erck

  Holisticon AG - Management- und IT-Beratung
   Architektur
   Agil/Projektmanagement
   BPM/SOA

  Berater
   Architektur
   Web-Technologien
   eBusiness
   Enterprise 2.0




                             Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 2
Inhalt

  Motivation
  Theorie
   Neuerung
   Bean-Verständnis
   Konzepte

  Praxis
  Beispielapplikation: „Friendly Invaders“




                          Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 3
Motivation - JSR 299

  Noch kein umfassendes DI Framework
  im Java EE Standard
  Standardisierung und Vereinfachung
  des Zusammenspiels
  von JSF und EJB
   Präsentationsschicht
   Geschäftslogik




                           Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 4
Neuerungen – Was bietet CDI?

  DI-Mechanismus (Dependency Injection)
  Deklarative Verknüpfung von Beans
  Scopes
  Interzeptorenkonzept
  Dekoratoren
  Bean-Verwaltung zur Laufzeit




                         Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 5
Bean-Verständnis - Beans

  JSF, EJB, Spring & CDI
   Eine Bean ist ein Objekt, dessen Lebenszyklus vom Container verwaltet wird.

  Managed Beans
   Parameterlosen Konstruktor | mit @Inject annotiert
   Lebenszyklus & Beziehungen verwaltet

  Session Beans
   Managed Beans + Lebenszyklus, Statusmanagement- & Nebenläufigkeitsmodell
   Stateless Session Bean und Singleton Session Bean „scopeless“
   Stateful Session Beans beliebiger Scope




                                      Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 6
Bean-Verständnis - Nicht Beans

   Message-Driven Beans
   Interzeptoren
   Servlets
   JAX WS Services
   JSP Tag Handler
   Tag Library Event Listener

  Können Beans injiziert bekommen




                                 Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 7
Konzepte

  Container, Kontext & Scope
   Verwaltung Lebenszyklus
   Beziehungen zwischen verwalteten Objekten
   Sichtbarkeit


  Application
  Session
  Conversation
  Request




                                    Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 8
Konzepte

  DI
   Nicht neu
   Java-EE-Applikationen

  Typsichere Auflösung                             Bean
   Typesave-Resolution-Algorithmus
                                                  @Inject
   Qualifier
   Alternativen




                            Default               Qualified                Alternative


                                      Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 9
Konzepte

  Lose Kopplung
   Client & Server
   Lebenszyklus
   Produzenten & Konsumenten

  Bean-Namen
   EL-Namen
   Keine JSF Managed Beans

  Interceptor-Binding & Dekoratoren
  SPI
   Portable Integration von Erweiterungen




                                     Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 10
Praxis

  Weld
   Referenzimplementierung JBoss

  Deployment-Deskriptor
   WAR: WEB-INF/beans.xml
   JAR: META-INF/beans.xml
   Kann leer sein




                                    Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 11
Praxis

  Werkzeugkiste
   DI
   Qualifier
   Alternativen
   EL-Namen
   Scopes
   Stereotypen
   Events
   Interceptor-Binding
   Dekoratoren
   Produzenten




                          Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 12
DI

@Stateless
public class BlogServiceBean implements BlogService {
 ...
}


public class InvasionController {
  @Inject
  private BlogService blogService;
  ...
}




                                     Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 13
Qualifier

@Qualifier
@Target({TYPE, METHOD, PARAMETER, FIELD})
@Retention(RUNTIME)
public @interface Holisticon {}


@Holisticon
@Stateless
public class HolisticonBlogServiceBean
    implements BlogService {
  ...
}




                                  Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 14
Qualifier

public class InvasionController {
    @Inject @Holisticon
    private BlogService blogService;
    ...
}

          Mehrere Implementierungen?
           @Default
           Sonst: Start verweigert
          WELD-001409 Ambiguous dependencies for type [BlogService] with qualifiers
          [@Default] at injection point ...




                                             Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 15
Alternativen

@Alternative
public class BlogServiceMock implements BlogService,
  Serializable{
    ...
}


          Aktivierung in beans.xml

<alternatives>
 <class>
  de.holisticon.blog.fiendlyInvaders.service.
    mock.BlogServiceMock
 </class>
</alternatives>



                                       Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 16
EL-Namen

    Bean CDI Kontext hinzufügen
@Named
public class InvasionController{
  @Inject @Holisticon
  private BlogService blogService;
  ...
}


<ui:repeat var="blogArticle“
 value="#{invasionController.blogArticles}“>
 #{blogArticle.title}
</ui:repeat>




                                      Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 17
Scopes

@Named
@SessionScoped
public class InvasionController implements Serializable {
    private static final long serialVersionUID = 1L;
    @Inject @Holisticon
    private BlogService blogService;
    ...
}

       Serialisierbar
        SessionSoped & ConversationScoped
        Sonst: Start verweigert
       WELD-000072 Managed bean declaring a passivating scope must be passivation
       capable.




                                         Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 18
Scopes

@Stateful
@ConversationScoped
public class CheckOutServiceBean {
 @Inject
 private Conversation conversation;
 private KudosCart kudosCart;

    public KudosCart createKudosCart() {
      kudosCart = new KudosCart();
      // if no conversation is "open“
      if (conversation.isTransient())
        conversation.begin();
      return kudosCart;
    }
    public void checkout() {
      kudosCart.getCart().clear();
      conversation.end();
    }
}



                                       Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 19
Stereotypen

    Annotationen gebündelt
@SessionScoped
@Named
@Stereotype
@Retention(RUNTIME)
@Target(TYPE)
public @interface NSS {}


@NSS
public class InvasionController implements Serializable{
  ...
}




                                   Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 20
Events

@Qualifier
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface Invaded {}

    Producer klassifizieren
     Filtern ermöglichen
@Inject @Invaded
private Event<BlogArticle> blogArticleEvent;
public String giveKudos(BlogArticle blogArticle, int amount{
 blogArticleEvent.fire(blogArticle);
 ...
}




                                   Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 21
Events

       Observer Lauschen
        InvasionTweeter
        InvasionMailer
        ...
@RequestScoped
public class InvasionTweeter{
    public void afterBlogIntrude(
      @Observes @Invaded BlogArticle blogArticle) {
      ...
    }
}




                                     Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 22
Events

  Observers + Producers = Observer Pattern?
   Jein
   Producer von Observer & Observer von Producern
   Verzögertes Aufrufen
   Filtern/Auswählen von Events (z.B. @Invaded vs. @Any)




                                    Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 23
Interceptor-Binding

@InterceptorBinding
@Retention (RUNTIME)
@Target ({METHOD, TYPE})
public @interface LoggerBinding {}


@LoggerBinding @Interceptor
public class LoggingInterceptor implements Serializable {
    private static final long serialVersionUID = 1L;
    @Inject
    private Logger log;
    @AroundInvoke
    public Object onMethodCall(InvocationContext context)
        throws Exception {
      ...
    }
}


                                        Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 24
Interceptor-Binding

@Stateful
@ConversationScoped
public class CheckOutServiceBean {
  ...
  @LoggerBinding
  public void checkout() {
    kudosCart.getCart().clear();
    conversation.end();
  }
}

    Aktivierung in beans.xml
<interceptors>
 <class>
   de.holisticon.blog.friendlyInvaders.
    interceptor.LoggingInterceptor
 </class>
</interceptors>


                                          Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 25
Dekoratoren

@Decorator
public abstract class CheckoutServiceDecorator
 implements CheckoutService, Serializable {
 ...
 @Inject @Delegate
 private CheckoutService checkoutService;
    public void giveKudos(
        BlogArticle blogArticle, float amount) {
      if (blogArticle.getAuthor().getName().
          endsWith("Erck")){
        logger.info("No Kudos in the form of money.");
      }else{
        checkoutService.giveKudos(blogArticle, amount);
      }
    }
}



                                        Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 26
Dekoratoren

    Aktivierung in beans.xml
<decorators>
 <class>
  de.holisticon.blog.friendlyInvaders.
   decorator.CheckoutServiceDecorator
 </class>
</decorators>

    Interzeptoren vs. Dekoratoren
     Jeden Java-Typ
     Technische Aspekte
     Konkreten Java-Typ
     Kennen Semantik
     Geschäftslogik



                                    Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 27
Produzenten

public class HcoLoggerFactory {
    @Produces @HcoLogger
    public Logger produceLogger(
       InjectionPoint injectionPoint){
      return LoggerFactory.getLogger(
       injectionPoint.getMember().getDeclaringClass().
         getName());
    }
}

       Default Scope: @Dependent
        Scope der Zielklasse  Mehrere Instanzen möglich




                                         Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 28
Produzenten

@Decorator
public abstract class CheckoutServiceDecorator
  implements CheckoutService, Serializable {
  ...
  @Inject @HcoLogger
  private Logger logger;
  ...
}

    Einsatzgebiete
     Variierender Typ zur Laufzeit
     Individuelle Initialisierung




                                      Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 29
Beispielapplikation




                      Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 30
Zusammenfassung

  DI Mechanismus (Dependency Injection)
   @Inject

  Deklarative Verknüpfung von Beans
   @Qualifier, @Alternative, @Stereotype

  Neue Scopes
   @ConversationScope & @Dependent

  Interzeptorenkonzept
   @InterceptorBinding

  Dekoratoren
   @Decorator & @Delegate

  Beanverwaltung zur Laufzeit
   @Producer


                                      Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 31
„Friendly Invaders“ & Tonspur




     http://blog.holisticon.de




                  Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 32
Vielen Dank!

Weitere ähnliche Inhalte

Ähnlich wie Freundliche Eindringlinge - Moderne Web-Applikationen mit CDI

Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsQAware GmbH
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsJosef Adersberger
 
Quellcode Analyse
Quellcode AnalyseQuellcode Analyse
Quellcode AnalyseAmir Neziri
 
Domain-Driven Design in der Praxis
Domain-Driven Design in der PraxisDomain-Driven Design in der Praxis
Domain-Driven Design in der PraxisMichael Mirold
 
Thread-safe .NET durch Immutables
Thread-safe .NET durch ImmutablesThread-safe .NET durch Immutables
Thread-safe .NET durch ImmutablesRobin Sedlaczek
 
Domain Driven Design in Rails
Domain Driven Design in RailsDomain Driven Design in Rails
Domain Driven Design in RailsAngelo Maron
 
JPA the Versant Way
JPA the Versant WayJPA the Versant Way
JPA the Versant Wayjubecker
 
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsjavaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsgedoplan
 
BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...
BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...
BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...Robin Sedlaczek
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
TYPO3 5.0 - Der aktuelle Stand der Zukunft
TYPO3 5.0 - Der aktuelle Stand der ZukunftTYPO3 5.0 - Der aktuelle Stand der Zukunft
TYPO3 5.0 - Der aktuelle Stand der ZukunftJochen Rau
 
Django - The Web framework for perfectionists with deadlines
Django - The Web framework for perfectionists with deadlinesDjango - The Web framework for perfectionists with deadlines
Django - The Web framework for perfectionists with deadlinesMarkus Zapke-Gründemann
 
FMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang Wunderlich
FMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang WunderlichFMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang Wunderlich
FMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang WunderlichVerein FM Konferenz
 
2009 - DNC: Silverlight ohne UI - Nur als Cache
2009 - DNC: Silverlight ohne UI - Nur als Cache2009 - DNC: Silverlight ohne UI - Nur als Cache
2009 - DNC: Silverlight ohne UI - Nur als CacheDaniel Fisher
 
Meine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 Berlin
Meine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 BerlinMeine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 Berlin
Meine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 BerlinDavid Decker
 
Softwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsSoftwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsGFU Cyrus AG
 

Ähnlich wie Freundliche Eindringlinge - Moderne Web-Applikationen mit CDI (20)

Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 
Quellcode Analyse
Quellcode AnalyseQuellcode Analyse
Quellcode Analyse
 
Domain-Driven Design in der Praxis
Domain-Driven Design in der PraxisDomain-Driven Design in der Praxis
Domain-Driven Design in der Praxis
 
Thread-safe .NET durch Immutables
Thread-safe .NET durch ImmutablesThread-safe .NET durch Immutables
Thread-safe .NET durch Immutables
 
Domain Driven Design in Rails
Domain Driven Design in RailsDomain Driven Design in Rails
Domain Driven Design in Rails
 
JPA the Versant Way
JPA the Versant WayJPA the Versant Way
JPA the Versant Way
 
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsjavaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
 
CDI
CDICDI
CDI
 
Codesmells
CodesmellsCodesmells
Codesmells
 
BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...
BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...
BASTA! Spring 2017 - Warum warten auf die IDE? Direct Coding in der eigenen A...
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
TYPO3 5.0 - Der aktuelle Stand der Zukunft
TYPO3 5.0 - Der aktuelle Stand der ZukunftTYPO3 5.0 - Der aktuelle Stand der Zukunft
TYPO3 5.0 - Der aktuelle Stand der Zukunft
 
PLUX.NET – SOFTWAREKOMPOSITION DURCH PLUG & PLAY
PLUX.NET – SOFTWAREKOMPOSITION DURCH PLUG & PLAYPLUX.NET – SOFTWAREKOMPOSITION DURCH PLUG & PLAY
PLUX.NET – SOFTWAREKOMPOSITION DURCH PLUG & PLAY
 
Django - The Web framework for perfectionists with deadlines
Django - The Web framework for perfectionists with deadlinesDjango - The Web framework for perfectionists with deadlines
Django - The Web framework for perfectionists with deadlines
 
FMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang Wunderlich
FMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang WunderlichFMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang Wunderlich
FMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang Wunderlich
 
2009 - DNC: Silverlight ohne UI - Nur als Cache
2009 - DNC: Silverlight ohne UI - Nur als Cache2009 - DNC: Silverlight ohne UI - Nur als Cache
2009 - DNC: Silverlight ohne UI - Nur als Cache
 
Meine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 Berlin
Meine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 BerlinMeine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 Berlin
Meine ersten 12 Monate als Plugin-Entwickler für WordPress - WP Camp 2012 Berlin
 
IntelliJ für Flex
IntelliJ für FlexIntelliJ für Flex
IntelliJ für Flex
 
Softwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsSoftwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration Tools
 

Freundliche Eindringlinge - Moderne Web-Applikationen mit CDI

  • 1. Freundliche Eindringlinge Moderne Web-Applikationen mit CDI
  • 2. Norman Erck Holisticon AG - Management- und IT-Beratung  Architektur  Agil/Projektmanagement  BPM/SOA Berater  Architektur  Web-Technologien  eBusiness  Enterprise 2.0 Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 2
  • 3. Inhalt Motivation Theorie  Neuerung  Bean-Verständnis  Konzepte Praxis Beispielapplikation: „Friendly Invaders“ Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 3
  • 4. Motivation - JSR 299 Noch kein umfassendes DI Framework im Java EE Standard Standardisierung und Vereinfachung des Zusammenspiels von JSF und EJB  Präsentationsschicht  Geschäftslogik Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 4
  • 5. Neuerungen – Was bietet CDI? DI-Mechanismus (Dependency Injection) Deklarative Verknüpfung von Beans Scopes Interzeptorenkonzept Dekoratoren Bean-Verwaltung zur Laufzeit Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 5
  • 6. Bean-Verständnis - Beans JSF, EJB, Spring & CDI  Eine Bean ist ein Objekt, dessen Lebenszyklus vom Container verwaltet wird. Managed Beans  Parameterlosen Konstruktor | mit @Inject annotiert  Lebenszyklus & Beziehungen verwaltet Session Beans  Managed Beans + Lebenszyklus, Statusmanagement- & Nebenläufigkeitsmodell  Stateless Session Bean und Singleton Session Bean „scopeless“  Stateful Session Beans beliebiger Scope Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 6
  • 7. Bean-Verständnis - Nicht Beans  Message-Driven Beans  Interzeptoren  Servlets  JAX WS Services  JSP Tag Handler  Tag Library Event Listener Können Beans injiziert bekommen Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 7
  • 8. Konzepte Container, Kontext & Scope  Verwaltung Lebenszyklus  Beziehungen zwischen verwalteten Objekten  Sichtbarkeit Application Session Conversation Request Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 8
  • 9. Konzepte DI  Nicht neu  Java-EE-Applikationen Typsichere Auflösung Bean  Typesave-Resolution-Algorithmus @Inject  Qualifier  Alternativen Default Qualified Alternative Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 9
  • 10. Konzepte Lose Kopplung  Client & Server  Lebenszyklus  Produzenten & Konsumenten Bean-Namen  EL-Namen  Keine JSF Managed Beans Interceptor-Binding & Dekoratoren SPI  Portable Integration von Erweiterungen Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 10
  • 11. Praxis Weld  Referenzimplementierung JBoss Deployment-Deskriptor  WAR: WEB-INF/beans.xml  JAR: META-INF/beans.xml  Kann leer sein Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 11
  • 12. Praxis Werkzeugkiste  DI  Qualifier  Alternativen  EL-Namen  Scopes  Stereotypen  Events  Interceptor-Binding  Dekoratoren  Produzenten Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 12
  • 13. DI @Stateless public class BlogServiceBean implements BlogService { ... } public class InvasionController { @Inject private BlogService blogService; ... } Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 13
  • 14. Qualifier @Qualifier @Target({TYPE, METHOD, PARAMETER, FIELD}) @Retention(RUNTIME) public @interface Holisticon {} @Holisticon @Stateless public class HolisticonBlogServiceBean implements BlogService { ... } Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 14
  • 15. Qualifier public class InvasionController { @Inject @Holisticon private BlogService blogService; ... } Mehrere Implementierungen?  @Default  Sonst: Start verweigert WELD-001409 Ambiguous dependencies for type [BlogService] with qualifiers [@Default] at injection point ... Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 15
  • 16. Alternativen @Alternative public class BlogServiceMock implements BlogService, Serializable{ ... } Aktivierung in beans.xml <alternatives> <class> de.holisticon.blog.fiendlyInvaders.service. mock.BlogServiceMock </class> </alternatives> Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 16
  • 17. EL-Namen Bean CDI Kontext hinzufügen @Named public class InvasionController{ @Inject @Holisticon private BlogService blogService; ... } <ui:repeat var="blogArticle“ value="#{invasionController.blogArticles}“> #{blogArticle.title} </ui:repeat> Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 17
  • 18. Scopes @Named @SessionScoped public class InvasionController implements Serializable { private static final long serialVersionUID = 1L; @Inject @Holisticon private BlogService blogService; ... } Serialisierbar  SessionSoped & ConversationScoped  Sonst: Start verweigert WELD-000072 Managed bean declaring a passivating scope must be passivation capable. Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 18
  • 19. Scopes @Stateful @ConversationScoped public class CheckOutServiceBean { @Inject private Conversation conversation; private KudosCart kudosCart; public KudosCart createKudosCart() { kudosCart = new KudosCart(); // if no conversation is "open“ if (conversation.isTransient()) conversation.begin(); return kudosCart; } public void checkout() { kudosCart.getCart().clear(); conversation.end(); } } Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 19
  • 20. Stereotypen Annotationen gebündelt @SessionScoped @Named @Stereotype @Retention(RUNTIME) @Target(TYPE) public @interface NSS {} @NSS public class InvasionController implements Serializable{ ... } Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 20
  • 21. Events @Qualifier @Target({FIELD, PARAMETER}) @Retention(RUNTIME) public @interface Invaded {} Producer klassifizieren  Filtern ermöglichen @Inject @Invaded private Event<BlogArticle> blogArticleEvent; public String giveKudos(BlogArticle blogArticle, int amount{ blogArticleEvent.fire(blogArticle); ... } Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 21
  • 22. Events Observer Lauschen  InvasionTweeter  InvasionMailer  ... @RequestScoped public class InvasionTweeter{ public void afterBlogIntrude( @Observes @Invaded BlogArticle blogArticle) { ... } } Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 22
  • 23. Events Observers + Producers = Observer Pattern?  Jein  Producer von Observer & Observer von Producern  Verzögertes Aufrufen  Filtern/Auswählen von Events (z.B. @Invaded vs. @Any) Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 23
  • 24. Interceptor-Binding @InterceptorBinding @Retention (RUNTIME) @Target ({METHOD, TYPE}) public @interface LoggerBinding {} @LoggerBinding @Interceptor public class LoggingInterceptor implements Serializable { private static final long serialVersionUID = 1L; @Inject private Logger log; @AroundInvoke public Object onMethodCall(InvocationContext context) throws Exception { ... } } Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 24
  • 25. Interceptor-Binding @Stateful @ConversationScoped public class CheckOutServiceBean { ... @LoggerBinding public void checkout() { kudosCart.getCart().clear(); conversation.end(); } } Aktivierung in beans.xml <interceptors> <class> de.holisticon.blog.friendlyInvaders. interceptor.LoggingInterceptor </class> </interceptors> Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 25
  • 26. Dekoratoren @Decorator public abstract class CheckoutServiceDecorator implements CheckoutService, Serializable { ... @Inject @Delegate private CheckoutService checkoutService; public void giveKudos( BlogArticle blogArticle, float amount) { if (blogArticle.getAuthor().getName(). endsWith("Erck")){ logger.info("No Kudos in the form of money."); }else{ checkoutService.giveKudos(blogArticle, amount); } } } Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 26
  • 27. Dekoratoren Aktivierung in beans.xml <decorators> <class> de.holisticon.blog.friendlyInvaders. decorator.CheckoutServiceDecorator </class> </decorators> Interzeptoren vs. Dekoratoren  Jeden Java-Typ  Technische Aspekte  Konkreten Java-Typ  Kennen Semantik  Geschäftslogik Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 27
  • 28. Produzenten public class HcoLoggerFactory { @Produces @HcoLogger public Logger produceLogger( InjectionPoint injectionPoint){ return LoggerFactory.getLogger( injectionPoint.getMember().getDeclaringClass(). getName()); } } Default Scope: @Dependent  Scope der Zielklasse  Mehrere Instanzen möglich Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 28
  • 29. Produzenten @Decorator public abstract class CheckoutServiceDecorator implements CheckoutService, Serializable { ... @Inject @HcoLogger private Logger logger; ... } Einsatzgebiete  Variierender Typ zur Laufzeit  Individuelle Initialisierung Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 29
  • 30. Beispielapplikation Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 30
  • 31. Zusammenfassung DI Mechanismus (Dependency Injection)  @Inject Deklarative Verknüpfung von Beans  @Qualifier, @Alternative, @Stereotype Neue Scopes  @ConversationScope & @Dependent Interzeptorenkonzept  @InterceptorBinding Dekoratoren  @Decorator & @Delegate Beanverwaltung zur Laufzeit  @Producer Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 31
  • 32. „Friendly Invaders“ & Tonspur http://blog.holisticon.de Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 32