Freundliche Eindringlinge        Moderne Web-Applikationen mit CDI
Norman Erck  Holisticon AG - Management- und IT-Beratung   Architektur   Agil/Projektmanagement   BPM/SOA  Berater   A...
Inhalt  Motivation  Theorie   Neuerung   Bean-Verständnis   Konzepte  Praxis  Beispielapplikation: „Friendly Invaders“ ...
Motivation - JSR 299  Noch kein umfassendes DI Framework  im Java EE Standard  Standardisierung und Vereinfachung  des Zus...
Neuerungen – Was bietet CDI?  DI-Mechanismus (Dependency Injection)  Deklarative Verknüpfung von Beans  Scopes  Interzepto...
Bean-Verständnis - Beans  JSF, EJB, Spring & CDI   Eine Bean ist ein Objekt, dessen Lebenszyklus vom Container verwaltet ...
Bean-Verständnis - Nicht Beans   Message-Driven Beans   Interzeptoren   Servlets   JAX WS Services   JSP Tag Handler ...
Konzepte  Container, Kontext & Scope   Verwaltung Lebenszyklus   Beziehungen zwischen verwalteten Objekten   Sichtbarke...
Konzepte  DI   Nicht neu   Java-EE-Applikationen  Typsichere Auflösung                             Bean   Typesave-Reso...
Konzepte  Lose Kopplung   Client & Server   Lebenszyklus   Produzenten & Konsumenten  Bean-Namen   EL-Namen   Keine J...
Praxis  Weld   Referenzimplementierung JBoss  Deployment-Deskriptor   WAR: WEB-INF/beans.xml   JAR: META-INF/beans.xml ...
Praxis  Werkzeugkiste   DI   Qualifier   Alternativen   EL-Namen   Scopes   Stereotypen   Events   Interceptor-Bin...
DI@Statelesspublic class BlogServiceBean implements BlogService { ...}public class InvasionController {  @Inject  private ...
Qualifier@Qualifier@Target({TYPE, METHOD, PARAMETER, FIELD})@Retention(RUNTIME)public @interface Holisticon {}@Holisticon@...
Qualifierpublic class InvasionController {    @Inject @Holisticon    private BlogService blogService;    ...}          Meh...
Alternativen@Alternativepublic class BlogServiceMock implements BlogService,  Serializable{    ...}          Aktivierung i...
EL-Namen    Bean CDI Kontext hinzufügen@Namedpublic class InvasionController{  @Inject @Holisticon  private BlogService bl...
Scopes@Named@SessionScopedpublic class InvasionController implements Serializable {    private static final long serialVer...
Scopes@Stateful@ConversationScopedpublic class CheckOutServiceBean { @Inject private Conversation conversation; private Ku...
Stereotypen    Annotationen gebündelt@SessionScoped@Named@Stereotype@Retention(RUNTIME)@Target(TYPE)public @interface NSS ...
Events@Qualifier@Target({FIELD, PARAMETER})@Retention(RUNTIME)public @interface Invaded {}    Producer klassifizieren    ...
Events       Observer Lauschen        InvasionTweeter        InvasionMailer        ...@RequestScopedpublic class Invasi...
Events  Observers + Producers = Observer Pattern?   Jein   Producer von Observer & Observer von Producern   Verzögertes...
Interceptor-Binding@InterceptorBinding@Retention (RUNTIME)@Target ({METHOD, TYPE})public @interface LoggerBinding {}@Logge...
Interceptor-Binding@Stateful@ConversationScopedpublic class CheckOutServiceBean {  ...  @LoggerBinding  public void checko...
Dekoratoren@Decoratorpublic abstract class CheckoutServiceDecorator implements CheckoutService, Serializable { ... @Inject...
Dekoratoren    Aktivierung in beans.xml<decorators> <class>  de.holisticon.blog.friendlyInvaders.   decorator.CheckoutServ...
Produzentenpublic class HcoLoggerFactory {    @Produces @HcoLogger    public Logger produceLogger(       InjectionPoint in...
Produzenten@Decoratorpublic abstract class CheckoutServiceDecorator  implements CheckoutService, Serializable {  ...  @Inj...
Beispielapplikation                      Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 30
Zusammenfassung  DI Mechanismus (Dependency Injection)   @Inject  Deklarative Verknüpfung von Beans   @Qualifier, @Alter...
„Friendly Invaders“ & Tonspur     http://blog.holisticon.de                  Freundliche Eindringlinge | Norman Erck | nor...
Vielen Dank!
Upcoming SlideShare
Loading in …5
×

Freundliche Eindringlinge - Moderne Web-Applikationen mit CDI

6,646 views

Published on

Was bis jetzt nur mit der Unterstützung von Frameworks wie Spring möglich war, möchte EJB 3.1 nun auch allein können: typsichere Dependency Injection von Managed Beans aller Art, innerhalb von Java-Kontexten, die über einen eigenen Lebenszyklus verfügen. Möglich macht es die “Contexts and Dependency Injection for Java EE” (CDI).
Dieser Vortrag stellt die neuen Konzepte und Sprachmittel, die dem Entwickler mit CDI zur Verfügung stehen, an einer durchgängigen Beispielanwendung vor, darunter Dependency Injection, Qualifier, Scores und Contexts, Interzeptoren sowie Dekoratoren, Events und Produzenten.

Published in: Technology, Health & Medicine
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
6,646
On SlideShare
0
From Embeds
0
Number of Embeds
3,593
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Freundliche Eindringlinge - Moderne Web-Applikationen mit CDI

  1. 1. Freundliche Eindringlinge Moderne Web-Applikationen mit CDI
  2. 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. 3. Inhalt Motivation Theorie  Neuerung  Bean-Verständnis  Konzepte Praxis Beispielapplikation: „Friendly Invaders“ Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 3
  4. 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. 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. 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. 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. 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. 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. 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. 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. 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. 13. DI@Statelesspublic class BlogServiceBean implements BlogService { ...}public class InvasionController { @Inject private BlogService blogService; ...} Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 13
  14. 14. Qualifier@Qualifier@Target({TYPE, METHOD, PARAMETER, FIELD})@Retention(RUNTIME)public @interface Holisticon {}@Holisticon@Statelesspublic class HolisticonBlogServiceBean implements BlogService { ...} Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 14
  15. 15. Qualifierpublic 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. 16. Alternativen@Alternativepublic 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. 17. EL-Namen Bean CDI Kontext hinzufügen@Namedpublic 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. 18. Scopes@Named@SessionScopedpublic 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. 19. Scopes@Stateful@ConversationScopedpublic 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. 20. Stereotypen Annotationen gebündelt@SessionScoped@Named@Stereotype@Retention(RUNTIME)@Target(TYPE)public @interface NSS {}@NSSpublic class InvasionController implements Serializable{ ...} Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 20
  21. 21. Events@Qualifier@Target({FIELD, PARAMETER})@Retention(RUNTIME)public @interface Invaded {} Producer klassifizieren  Filtern ermöglichen@Inject @Invadedprivate Event<BlogArticle> blogArticleEvent;public String giveKudos(BlogArticle blogArticle, int amount{ blogArticleEvent.fire(blogArticle); ...} Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 21
  22. 22. Events Observer Lauschen  InvasionTweeter  InvasionMailer  ...@RequestScopedpublic class InvasionTweeter{ public void afterBlogIntrude( @Observes @Invaded BlogArticle blogArticle) { ... }} Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 22
  23. 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. 24. Interceptor-Binding@InterceptorBinding@Retention (RUNTIME)@Target ({METHOD, TYPE})public @interface LoggerBinding {}@LoggerBinding @Interceptorpublic 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. 25. Interceptor-Binding@Stateful@ConversationScopedpublic 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. 26. Dekoratoren@Decoratorpublic 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. 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. 28. Produzentenpublic 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. 29. Produzenten@Decoratorpublic 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. 30. Beispielapplikation Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 30
  31. 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. 32. „Friendly Invaders“ & Tonspur http://blog.holisticon.de Freundliche Eindringlinge | Norman Erck | norman.erck@holisticon.de | 32
  33. 33. Vielen Dank!

×