java ee - fhws 2014 - 6 cdi

34
Java EE Full Stack for Business Applications Contexts and Dependency Injection

Upload: matthias-reining

Post on 16-Jul-2015

148 views

Category:

Software


0 download

TRANSCRIPT

Java EEFull Stack for Business Applications

Contexts and Dependency Injection

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

CDIContexts and Dependency Injection

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

BESTANDSAUFNAHME

Wer hat mit CDI „bewusst“ bereits gearbeitet?

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

nach JPA, JSF, EJB…wozu jetzt noch CDI???Unsere Anwendung funzt doch bereits…

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;

}

}

Patternshttp://de.wikipedia.org/wiki/Entwurfsmuster

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

[Quelle: http://java.at/c/document_library/get_file?folderId=26186&name=DLFE-302.pdf]

@INTERCEPTOR

Mit Interceptoren können Querschnittsaufgabe realisiert werden.

Logging

Transaktionssteuerung

Security

[Quelle: http://java.at/c/document_library/get_file?folderId=26186&name=DLFE-302.pdf]

[Quelle: http://java.at/c/document_library/get_file?folderId=26186&name=DLFE-302.pdf]

[Quelle: http://java.at/c/document_library/get_file?folderId=26186&name=DLFE-302.pdf]

TESTOhne Container / Mit Container

http://arquillian.org