Download - Java EE - FHWS 2014 - 6 CDI
Referent: MATTHIAS REINING
Technical Manager Insurance at RGI Deutschland GmbH
blog: http://blog.matthias-reining.com
twitter: https://twitter.com/MatthiasReining
about.me: http://about.me/matthiasreining
DAS PROGRAMM
Die Spec Idee, Historie
Der App Server Containerkonzept
Paketierung (JAR, WAR, EAR)
Marktüberblick
Das Projekt Entwicklung eines Beispielprojektes
IDE Settings, Oberflächen (Servlets, JSF), Business Logic (EJB), Persistence (JPA), Java EE Patterns (CDI), Web Services (JAX-RS)
Die Produktion Buildmanagement (maven, Jenkins)
Deployment einer Java EE Anwendung in der Cloud bei einem PaaS Anbieter
Context and Dependency Injection
CDI standardisiert das Prinzip der Dependency Injection für Java, wonachdie von einem Modul verwendeten Abhängigkeiten von außen demModul bekannt gemacht werden und im Modul lediglich als Abhängigkeit– Interface oder Klasse, jedenfalls keine konkrete Objektinstanz –definiert sind. Abhängig vom Kontext (beispielsweise in einerStandalone-Anwendung oder als Enterprise-Bean in einemAnwendungsserver, aber auch im Modultest oder Integrationstest)können diese Abhängigkeiten verschieden gesetzt werden
[Quelle: http://de.wikipedia.org/wiki/Contexts_and_Dependency_Injection]
Context and Dependency Injection
Contexts and Dependency Injection for Java EE (CDI) is one of severalJava EE features that help to knit together the web tier and thetransactional tier of the Java EE platform. CDI is a set of services that,used together, make it easy for developers to use enterprise beans alongwith JavaServer Faces technology in web applications. Designed for usewith stateful objects, CDI also has many broader uses, allowingdevelopers a great deal of flexibility to integrate various kinds ofcomponents in a loosely coupled but typesafe way.
[Quelle: http://docs.oracle.com/javaee/7/tutorial/doc/cdi-basic.htm#GIWHB]
CDI – SpecReference Implementation: WeldAlternative: OpenWebBeans
Konkrete Implementierung hängt vom Application Server ab!
CDI
Tutorials / Nachschlagewerke
http://docs.oracle.com/javaee/7/tutorial/doc/cdi-basic.htm
http://de.slideshare.net/mojavelinux/jsr299-cdi-weld-the-future-of-seam-javaone-2010
http://blog.frankel.ch/cdi-an-overview-part-1http://blog.frankel.ch/cdi-an-overview-part-2
Gründe für CDI…
CDI verbessert
die Erweiterungsfähigkeit,
Wartbarkeit und
die Testbarkeit
einer Anwendung durch die Möglichkeit zur
Entkopplung von Komponenten
Contexts: This service enables you to bind the lifecycle and interactions of stateful components to well-defined but extensible lifecycle contexts.
Dependency injection: This service enables you to inject components into an application in a typesafe way and to choose at deployment time which implementation of a particular interface to inject.
[Quelle: http://docs.oracle.com/javaee/7/tutorial/doc/cdi-basic002.htm#GIWHL]
„Großes Kino“
Unbekanntes (CDI) mit noch mehr unbekannten (Seam, Guice, Spring) erklären…
Direkteinspritzer
Die Java Specification Requests 330 und 299 haben es
kurz vor Toresschluss in die Java-EE-6-Spezifikation
geschafft. Gemeinsam bilden sie die Grundlage für die
typsichere Injektion von Abhängigkeiten. Die nicht
unumstrittenen JSRs haben den Anspruch, die besten
Funktionen aus etablierten Frameworks wie Seam, Guice
und Spring zu vereinen und als Standard zu etablieren.
[Quelle: Markus Eisele http://www.heise.de/ix/artikel/Direkteinspritzer-958569.html]
Dependency Injection (DI) ist ein Entwurfsmuster und dient in einem objektorientierten System dazu, die Abhängigkeiten zwischen Komponenten oder Objekten zu minimieren.
Dependency Injection ist eine Anwendung des Prinzips der Inversion of Control (IoC), bezieht sich aber nur auf die Erzeugung und Initialisierung von Objekten.
[Quelle: http://de.wikipedia.org/wiki/Dependency_Injection (Version vom 30. Januar 2012)]
DI Java Frameworks
Spring
EJB3.x
JBoss Seam (mittlerweile nur noch JBoss Weld)
Google Guice
CDI, Standard für DI (JSR-299) Spezifikation, die im Rahmen der JEE6, mit Frameworks wie bspw. Seam Weld implementiert ist.
Der CDI Container
Der Container von CDI kann fast jegliche Instanzen von konkreten Java Klassen verwalten Java Beans
Session Beans
Damit der CDI Container dies macht muss eine beans.xml vorhanden sein.
Die verwalteten Beans haben in einem Context eine Sichtbarkeit (Scope)
CDI Overview
CDI provides the following services:
Integration with the Expression Language (EL), which allows any component to be used directly within a
JavaServer Faces page or a JavaServer Pages page
The ability to decorate injected components
The ability to associate interceptors with components using typesafe interceptor bindings
An event-notification model
A web conversation scope in addition to the three standard scopes (request, session, and application)
defined by the Java Servlet specification
A complete Service Provider Interface (SPI) that allows third-party frameworks to integrate cleanly in the
Java EE 7 environment
[Quelle: http://docs.oracle.com/javaee/7/tutorial/doc/cdi-basic002.htm#GIWHL]
CDI Overview
A major theme of CDI is loose coupling. CDI does the following:
Decouples the server and the client by means of well-defined types and qualifiers, so that the server implementation may vary
Decouples the lifecycles of collaborating components by Making components contextual, with automatic lifecycle management
Allowing stateful components to interact like services, purely by message passing
Completely decouples message producers from consumers, by means of events
Decouples orthogonal concerns by means of Java EE interceptors
[Quelle: http://docs.oracle.com/javaee/7/tutorial/doc/cdi-basic002.htm#GIWHL]
CDI Overview
Along with loose coupling, CDI provides strong typing by
Eliminating lookup using string-based names for wiring and correlations so that the compiler will detect typing errors
Allowing the use of declarative Java annotations to specify everything, largely eliminating the need for XML deployment descriptors, and making it easy to provide tools that introspect the code and understand the dependency structure at development time
[Quelle: http://docs.oracle.com/javaee/7/tutorial/doc/cdi-basic002.htm#GIWHL]
@javax.inject.Inject
In CDI kann fast jedes Objekt ein „Bean“ sein Bei CDI spricht man von einem Bean, wenn das Objekt per CDI gemangt wird
Beans werden von CDI instanziiert (CDI BeanManager oder Injection Point @Inject)Wir ein Bean mit new erzeugt, ist das Objekt nicht gemangt („Hollywood und so…“)
Der „Bean-Lifecycle“ wird context-bezogen gemanagt (später dazu mehr)
@Inject
private Message
message;
CDI SCOPES
In CDI bestimmt der Context den Lebenszyklus (Dauer und Sichtbarkeit) eines Objektes
Der Entwickler konfiguriert den Scope eines Objektes:
@ApplicationScoped (Gesamtdauer der Applikation)
@SessionScoped (Dauer einer Benutzer Session)
@ConversationScoped (Dauer einer Konversation)
@RequestScoped (Dauer eines Requests)
@Dependent (Abhängig vom Lebenszyklus einer übergeordneten Bean)
Mit dieser Information steuert der Context die Instanziierung und die Freigabe von Objekten
CDI Scopes
Normal Scopes RequestScoped
ConversationScoped
SessionScoped
ApplicationScoped
Am Injection Point wird ein Proxy Objekt injiziert.
Die Verlinkung auf das „echte“ Objekt findet erst beim ersten Zugriff auf das Objekt statt.
Pseudo Scopes
DependentScoped
„Singleton“
Die Objekte werden direkt injiziert.
Die Producer-Methode wird bei jedem Injection Point aufgerufen
@javax.enterprise.inject.Instance
CDI - Programmatic Lookup:
Das Injizieren bei @Inject wird
immer während der Erzeugung
eines Objektes durchgeführt.
Dies kann manchmal allerdings
nicht erwünscht sein.
Der Lookup kann aber auch
programmiert werden:
@Inject
Instance<Message>
messageProducer;
public Message getMessage()
{
return
messageProducer.get();
}
@javax.enterprise.inject.Produces
CDI – Producer
Um ein Objekt schon mit bestimmten
Werte beispielsweise zu initialisieren,
können spezielle Producer Methoden
geschrieben werden.
Wenn man eine Liste injizieren will,
benötigt man ebenfalls eine Producer
Methode, da List eine JDK Klasse, die
nicht direkt annotiert werden kann.
public class UserController {
@Produces
public User getUser() {
User user = new User();
user.setFirstname("Max");
user.setLastname("Mustermann");
return user;
}
}
@javax.inject.Named
CDI Named Beans
Named Beans (@Named) ermöglichen den Zugriff auf die Beans innerhalb von Webanwendungen.
Der Bean kann über den Namen direkt in JSF / JSP Seiten per Expression Language verwendet werden.
public class UserController {
@Produces
@Named
public GPUser getUser() {
User user = new User();
user.setFirstname("Max");
user.setLastname("Mustermann");
return user;
}
}
Patterns
• Singleton• Factory / Producer
http://en.wikipedia.org/wiki/Factory_(object-oriented_programming)
• Interceptor• Decorators
http://en.wikipedia.org/wiki/Decorator_patternhttp://de.wikipedia.org/wiki/Decorator
• Observershttp://en.wikipedia.org/wiki/Observer_patternhttp://de.wikipedia.org/wiki/Beobachter_%28Entwurfsmuster%29
@INTERCEPTOR
Mit Interceptoren können Querschnittsaufgabe realisiert werden.
Logging
Transaktionssteuerung
Security