J2EE ohne EJB?! -...

32
J2EE ohne EJB?! Leichtgewichtige Komponentenframeworks in der J2EE Karsten Queißer Christian Schröder

Transcript of J2EE ohne EJB?! -...

J2EE ohne EJB?!

Leichtgewichtige Komponentenframeworks in der J2EE

Karsten Queißer Christian Schröder

J2ee ohne EJB?! 2 / 26 www.unilog-avinci.de

Agenda

J2EE

Komponenten

Grundlagen

Leichtgewichtige Komponentenframeworks

Bewertung

Ausblick

J2ee ohne EJB?! 3 / 26 www.unilog-avinci.de

J2EE

J2ee ohne EJB?! 4 / 26 www.unilog-avinci.de

Was sind Komponenten?

grundlegende EigenschaftenTeil einer ZusammenstellungBesitzt festgelegte SchnittstellenBesitzt definierte Abhängigkeiten/definierte UmgebungIst unabhängig einsetzbarBenötigt eine externe Umgebung um zu arbeiten

Verwendet eigenes Wissen um ihre Aufgabe zu erledigen

„A software component is a unit of composition with contractuallyspecified interfaces and explicit context dependencies only. A software componente can be deployed independently and is subject to composition by third parties.“ – Clemens Szyperski

J2ee ohne EJB?! 5 / 26 www.unilog-avinci.de

Vorteile von Komponenten

Partitionierung des ProblemsLose Kopplung Design-by-Contract

VerbesserteWartbarkeit

Wiederverwend-barkeit

J2ee ohne EJB?! 6 / 26 www.unilog-avinci.de

Marktplatz

Komponenten-bibliothek

Entwickler wählt die passenden KomponentenEntwickler ergänzt evt. fehlende KomponentenEntwickler verbindet die Komponenten miteinanderEntwickler initialisiert die Komponenten für das Problem

Komponentenorientierte Entwicklung

AuswählenVerbindenEinrichten

Konfiguration

Anwendung

J2ee ohne EJB?! 7 / 26 www.unilog-avinci.de

Aufgaben eines Komponentenframeworks

Initialisierte Komponenten erzeugenWirkung als „Abstrakte Fabrik“

Komponenten verknüpfenLebenszyklus überwachen

Erzeugung und Zerstörung

„It is far too simplistic to assume that components are simply selectedfrom catalogs, thrown together, and magic happens. In reality, dhedisciplined interplay of components is one of the hardest problems of software engineering today.“ – Clemens Szyperski

J2ee ohne EJB?! 8 / 26 www.unilog-avinci.de

Entwicklung mit einem Komponentenframework

Entwickler beschreibt Komposition der KomponentenEntwickler beschreibt Initialisierung der KomponentenFramework übernimmt programmatische Verbindung

Marktplatz

Komponenten-bibliothek

AnwendungKomponentenframework

DeklarativeKonfiguration

J2ee ohne EJB?! 9 / 26 www.unilog-avinci.de

Hohe Integration in den Container

Hohe AbhängigkeitSchwer testbar (Unit Test)

Nicht vorgesehen in Spezifikation

Striktes Programmiermodell

An EJB-API gebundenDesigneinschränkungen

Vererbung nötig eingeschränktes Domänenmodell

Aktuelle EJB Spezifikation

EJB-Container

EJB-API

J2EE Application Server

J 2 E E

S e r v i c e s

Deskriptoren

EJB

EJBEJB

J2ee ohne EJB?! 10 / 26 www.unilog-avinci.de

Sinnvolle Erweiterungen von EJBs?

einfache Komposition der KomponentenExtern und zentral konfigurierbar

einfache InitialisierungTestbarkeit der Komponenten bewahren

Komponenten unabhängig von kompletter Laufzeitumgebung verwendbarAbhängigkeiten von der Komponente fernhalten

zurückhaltende APIKeine VererbungKeine oder nur einfache InterfacesKeine komplexen Nebenbedingungen

POJO

Dependency

Injection

J2ee ohne EJB?! 11 / 26 www.unilog-avinci.de

Komponenten

Komponentenframework

EJB Schwächen

Verbesserungen

J2ee ohne EJB?! 12 / 26 www.unilog-avinci.de

Was ist ein POJO?

Plain Old Java Object = POJO„Einfaches“ Java-Objekt

Keine fachfremden SchnittstellenKeine fachfremden ProgrammiermetaphernKein Teil eines Frameworks

ZielKonzentration/Fokussierung auf fachliche ProblemstellungVermeidung unnötiger Einschränkungen und Abhängigkeiten in der fachlichen Ebene

Begriff geht auf Martin Fowler zurück

J2ee ohne EJB?! 13 / 26 www.unilog-avinci.de

Was ist Dependency Injection (DI)?

Form der Inversion of Controlbezogen auf die Umweltkomposition einer Komponente

Abhängigkeiten werden von außen erfüllt„Hollywood Principle“

Don‘t call us, we call you.

ZielEntkopplung der Komponente von ihrer UmgebungReduktion des notwendigen Wissens über die Umgebung

Ohne Dependency

Injection

Mit Dependency

Injection

J2ee ohne EJB?! 14 / 26 www.unilog-avinci.de

Was zeichnet ein leichtgewichtiges Komponentenframework aus?

Nicht-invasive (zurückhaltende) APIKeine weiteren Interfaces oder Vererbungsstrukturen

Komponenten als POJOFrameworklose Nutzung möglich

Verwendung von Dependency InjectionIsolierung voneinanderKlare Trennung der Belange

Verantwortlichkeit für Umgebungserfüllung übernimmt das FrameworkVerantwortung für Umgebungsnutzung liegt innerhalb der Komponente

Konfigurierbare KompositionAuflösung zirkulärer AbhängigkeitenUnterstützung für Komponentenlebenszyklen

J2ee ohne EJB?! 15 / 26 www.unilog-avinci.de

J2ee ohne EJB?! 16 / 26 www.unilog-avinci.de

Picocontainer

Ziel / AnspruchEinfaches Komponentenframework mit einer nicht-invasiven API

MittelPOJODependency Injection

GrundkonzeptContainer der über die Implementierungen informiert wirdKonfiguration im JavaCodeSelbständiges Auflösen von Abhängigkeiten

Nanocontainer ist eine Erweiterung des PicocontainersExterne Konfiguration (XML, Groovy, Jython)AOP UnterstützungAdapter für Hibernate als OR-Mapper

J2ee ohne EJB?! 17 / 26 www.unilog-avinci.de

Spring

Ziel / AnspruchFlexibles Anwendungsframework mit einem Komponentenframework als Basis

MittelPOJODependency InjectionAdapterkomponenten für vorhandene TechnologienUnterstützung für Aspektorientierung

GrundkonzeptXML-Konfigurationsdatei als Basis mit benannten KomponentenKomposition wird festgelegtAdapterklassen für viele Drittanbietertechnologien (Hibernate, iBatis, Quartz, Velocity, …) die als Komponente konfiguriert werden

J2ee ohne EJB?! 18 / 26 www.unilog-avinci.de

Spring Überblick

J2ee ohne EJB?! 19 / 26 www.unilog-avinci.de

EJB 3.0

ZielKomponentenframework der J2EE„Vereinfachung aus Sicht des Entwicklers“

MittelDependency Injection über JNDI Lookups

eher Workaround als Lösungkeine Deskriptoren, dafür Java 5 Annotations

KonzeptPOJO Komponenten

wird nicht eingehalten (Annotations Abhängigkeit von EJB-API)

J2ee ohne EJB?! 20 / 26 www.unilog-avinci.de

Bewertung Pico

Zielgerichtete ImplementierungSehr kleine Bibliotheken im Vergleich mit Mitbewerbern

Einfache und unkomplizierte NutzungLeicht integrierbar in bestehende Softwarelandschaften und –systeme

Konfiguration in JavaKein Kontextwechsel zu XML

Picocontainer ist klein und schnell einsetzbarAuch wenn die Größe kein ausschlaggebendes Kriterium ist, so ist Picocontainer für Prototyping sehr gut geeignet

J2ee ohne EJB?! 21 / 26 www.unilog-avinci.de

Bewertung Spring

Basis Funktionalität: Management der Business ObjekteUmfassend und trotzdem modular

auch in Teilaspekten (z.B. zunächst nur als Vereinfachung von JDBC) einsetzbarstep-by-step integrierbar

Gute TestbarkeitHohe Akzeptanz im Markt, zunehmend auch Herstellerunterstützung

Umfangreiches Anwendungsframework, welches keinen großen fachfremden Einfluss auf die Anwendung ausübt

J2ee ohne EJB?! 22 / 26 www.unilog-avinci.de

Bewertung EJB 3.0

Standard noch nicht verabschiedetEarly draft review 2

Noch nicht verfügbar, 2007 ist angestrebt für zertifizierteImplementierungen

J2ee ohne EJB?! 23 / 26 www.unilog-avinci.de

J2EE ohne EJB

J2ee ohne EJB?! 24 / 26 www.unilog-avinci.de

Marktüberblick

Apache AvalonEingestellt, aufgegangen in Excalibur und Loom

CarbonKomponentenframework und Serviceplattform

HiveMindKomponentenframework als MikroKernel aufgefasst

KeelApplikationsframework mit grundlegenden nicht-fachlichen Diensten

PicoContainer / NanoContainerKleine zielgerichtete Implementierung eines Komponentenframeworks

SpringApplikationsframework mit Adaptern für verschiedene Drittanbietertechnologien

J2ee ohne EJB?! 25 / 26 www.unilog-avinci.de

Warum eigentlich nicht?

Auswirkung auf Entwicklung und Architektur geringMehraufwand geringDirekte Einsparung in der Entwicklung des GlueCodesEine sehr freie Designmethode für die Komponenten wird vorgegeben (POJO)

Komponenten ohne großen MehraufwandWiederverwendbarkeitFlexibilitätDesign-by-contract

J2ee ohne EJB?! 26 / 26 www.unilog-avinci.de

Ende

Vielen Dank für Ihre Aufmerksamkeit.

Fragen?Diskussionen!

J2ee ohne EJB?! 27 / 26 www.unilog-avinci.de

Finale Grande

J2ee ohne EJB?! 28 / 26 www.unilog-avinci.de

Dependency Injection I(Constructor Injection)

Konstruktor mit den Parametern für alle AbhängigkeitenVorteile

Klar erkennbare AbhängigkeitenKonsistenter Zustand ist garantiert

NachteileProblematisch in VererbungshierarchienZirkuläre Abhängigkeiten verursachen Mehraufwand zur Auflösung

public interface Service { /*Serviceschnittstelle*/ }

public interface Komponente { /*Komponentenschnittstelle*/ }

public class KomponentenImpl {

Service service;

public KomponentenImpl(Service serviceInjected) {

this.service = serviceInjected;

}

}

J2ee ohne EJB?! 29 / 26 www.unilog-avinci.de

Dependency Injection II(Setter Injection)

Setter Methoden für alle AbhängigkeitenVorteile

Sehr flexibelbenannte Abhängigkeiten erhöhen die Verständlichkeit

NachteileInkonsistente Zustände möglich

public interface Service { /*Serviceschnittstelle*/ }

public interface Komponente { /*Komponentenschnittstelle*/ }

public class KomponentenImpl {

Service service;

public void setService(Service serviceInjected) {

this.service = serviceInjected;

}

}

J2ee ohne EJB?! 30 / 26 www.unilog-avinci.de

Setter Injection vs Constructor Injection

public interface Service { /*Serviceschnittstelle*/ }

public interface Komponente { /*Komponentenschnittstelle*/ }

public class KomponentenImpl {

Service service;

public void setService(Service serviceInjected) {

this.service = serviceInjected;

}

}

public interface Service { /*Serviceschnittstelle*/ }

public interface Komponente { /*Komponentenschnittstelle*/ }

public class KomponentenImpl {

Service service;

public KomponentenImpl(Service serviceInjected) {

this.service = serviceInjected;

}

}

J2ee ohne EJB?! 31 / 26 www.unilog-avinci.de

zirkuläre Abhängigkeiten

Problem: Constructor Injection kann zirkuläre Abhängigkeiten nicht auflösen

Zur Erstellung von Komponenten A ist eine Komponente B nötig, um diese zu erstellen benötigt man jedoch Komponente A

InjectionDelegation

J2ee ohne EJB?! 32 / 26 www.unilog-avinci.de

Java 5 Annotations

Metadaten, Informationen über den QuellcodeÄndern nicht die Semantik des Programms

Sind als Anweisungen für den Compiler, für andere Werkzeuge oderLaufzeitumgebungen zu verstehen

Dadurch nehmen sie indirekt Einfluss auf die Semantik des ProgrammsKönnen im Sourcecode, im Binärcode und zur Laufzeit ausgelesen werdenMüssen importiert werden wie normale Java-Klassen

Typprüfung durch Compiler möglich, Quellcodeabhängigkeit

@deprecated Javadoc gibt es schon seit Java 2Erzeugt eine Compilerwarnung obwohl es in einem Kommentar stehtEinfluss von Nicht-Sourcecode auf die ProgrammerzeugungVorläufer der neuen Java 5 Annotations