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.
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
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