Prof. Dr.-Ing. Holger Vogelsang [email protected] Informatik 2 Objektorientierter...

102
Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs- karlsruhe.de Informatik 2 Objektorientierter Entwurf

Transcript of Prof. Dr.-Ing. Holger Vogelsang [email protected] Informatik 2 Objektorientierter...

Page 1: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Prof. Dr.-Ing. Holger Vogelsang [email protected]

Informatik 2Objektorientierter Entwurf

Page 2: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 2

Inhaltsverzeichnis

Prinzipien (3) Verbindung von Modulen (35) Modularisierung mit Spring (51) Modularisierung mit OSGi (79) Ende (102)

Page 3: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 3

Prinzipien Übersicht

Typinfo.,I/O

Annota-tionen

Laufzeit-typinfo.

Ein-,Ausgabe

Entwurf Prinzipien Verbindungvon Modulen OSGiSpring

GrafischeOberflä-

chenÜbersicht Layouts Widgets Grafik-

operationenGrafik-

widgetsEffekte,

AnimationenOffenePunkteEreignisse

Daten-strukturen ADTs Elementare

DatenstrukturenHash-

tabellen Bäume GraphenIteratorenDatenstrukturenin Java

Page 4: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 4

Prinzipien Motivation

Was ist ein Modul? Wie werden Module logisch miteinander verknüpft? Welche technischen Hilfsmittel unterstützen die Modularisierung? Aufstellung einiger einfacher Regeln zur Beherrschung der Komplexität von

Softwaresystemen. Vorbereitung der Software, so dass zukünftige Änderungswünsche einfacher

eingebaut werden können.

Page 5: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 5

Prinzipien Modul

Definition: ModulEin Modul ist ein überschaubarer und eigenständiger Teil einer Anwendung:

eine Quelltextdatei eine Menge von Quelltextdateien ein Abschnitt in einer Quelltextdatei

Ein Modul ist etwas, was ein Programmierer als eine Einheit betrachtet, die als ein Ganzes bearbeitet und verwendet wird. Jedes Modul hat nun innerhalb einer Anwendung eine bestimmte Aufgabe, für die es die Verantwortung trägt.

Page 6: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 6

Prinzipien Prinzip 1: Prinzip einer einzigen Verantwortung

Verantwortung (Responsibility) eines Moduls: Ein Modul hat innerhalb eines Softwaresystems eine oder mehrere Aufgaben. Das Modul hat die Verantwortung, diese Aufgaben zu erfüllen.

Prinzip einer einzigen Verantwortung (Single Responsibility Principle): Jedes Modul soll genau eine Verantwortung übernehmen. Jede Verantwortung soll genau einem Modul zugeordnet werden. Die Verantwortung bezieht sich auf die Verpflichtung des Moduls, bestimmte

Anforderungen umzusetzen. Es gibt nur einen einzigen Grund, ein Modul anzupassen: Die Anforderungen, für die es

verantwortlich ist, haben sich geändert. Zusammenfassung: Eine Anforderung (Aufgabe) soll nicht über mehrere Module verteilt oder

in mehreren Modulen doppelt implementieren werden.

Page 7: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 7

Prinzipien Prinzip 1: Prinzip einer einzigen Verantwortung

Vorteile des Prinzips: Bessere Änderbarkeit, damit bessere Wartbarkeit:

- Ändern sich Anforderungen, muss auch die Software geändert werden. - Zunächst muss herausgefunden werden, welcher Programmteil die Anforderungen

implementiert.- Da jedes Modul genau einer Aufgabe zugeordnet ist, ist die Identifikation sehr

einfach.- Ein Durchsuchen aller möglichen Module nach winzigen Codefragmenten ist nicht

erforderlich. Erhöhung der Chance auf Mehrfachverwendung:

- Ist ein Modul für eine Aufgabe zuständig, wird die Wahrscheinlichkeit, dass das Modul angepasst werden muss, verkleinert.

- Bei einem Modul, das mehr Verantwortung als nötig trägt, ist die Wahrscheinlichkeit, dass es von mehreren anderen Modulen abhängig ist, größer. Diese andere Module lassen sich u.U. in einem anderen Kontext nicht oder nur schlecht verwenden.

Page 8: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 8

Prinzipien Prinzip 1: Prinzip einer einzigen Verantwortung

Regeln zur Umsetzung des Prinzips: Kohäsion maximieren: Ein Modul soll zusammenhängend (kohäsiv) sein:

- Alle Teile eines Moduls sollten mit anderen Teilen des Moduls zusammenhängen und voneinander abhängig sein.

- Haben Teile eines Moduls keinen Bezug zu anderen Teilen, kann man davon ausgehen, dass diese Teile als eigenständige Module implementiert werden können.

Kopplung minimieren:- Wenn für die Umsetzung einer Aufgabe viele Module zusammenarbeiten müssen,

bestehen Abhängigkeiten zwischen diesen Modulen Die Module sind gekoppelt.- Die Kopplung zwischen Modulen sollte möglichst gering gehalten werden. Dies kann

oft erreicht werden, indem die Verantwortung für die Koordination der Abhängigkeiten einem neuen Modul zugewiesen wird.

Page 9: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 9

Prinzipien Prinzip 1: Prinzip einer einzigen Verantwortung

Minimierung der Kopplung (graue Kästchen sind Module):

Problem: Im Extremfall koppelt immer ein zentrales Modul Abhängigkeiten zwischen den Modulen sind nicht mehr erkennbar!

Lösung: kommt mit den folgenden Prinzipien

Hoher Kopplungsgrad Niedriger Kopplungsgrad

Page 10: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 10

Prinzipien Prinzip 2: Trennung der Anliegen

Anliegen (Concern) eines Moduls: Eine formulierbare Aufgabe, die zusammenhängend und abgeschlossen ist

Prinzip der Trennung der Anliegen (Separation of Concerns): Ein im Programm identifizierbares Anliegen soll durch ein Modul repräsentiert werden. Ein Anliegen soll nicht über mehrere Module verstreut sein.

Sehr ähnlich zu Prinzip 1: Ein Modul soll eine Verantwortung besitzen.

Beispiele: Trennung von Benutzungsschnittstelle und auszugebender Sprache Trennung von Ausgabe und Berechnung Trennung von Berechnung und Speicherung in einer Datei

Page 11: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 11

Prinzipien Prinzip 2: Trennung der Anliegen

Funktioniert das immer? Beispiel 1:

- Eine Klasse mit ihren Methoden hat ein Anliegen.- Sie will zu Testzwecken Log-Ausgaben vornehmen. Die Log-Ausgaben sind aber ein

anderes Anliegen.- Das Anliegen „Log-Ausgaben“ wird auf viele Methoden verteilt Verstoß gegen das

Prinzip. Beispiel 2: Bei verteilten Anwendungen (z.B. Web-Anwendungen) muss auf der Server-

Seite bei vielen Aufrufen geprüft werden, ob der angemeldete Benutzer überhaupt die Rechte besitzt, die Methoden aufzurufen.

Beispiel 3: Methoden sollen Transaktionen unterstützen: Entweder sie laufen komplett durch oder der Zustand der veränderten Objekte wird auf den Startzustand vor dem Aufruf zurückgesetzt ( siehe später bei Datenbanken).

Beispiel 4: Die Ausnahmen vieler Methoden sollen zentral behandelt werden. Diese Querschnittsaufgaben („Cross-Cutting Concerns“) wie Protokollierung finden sich

überall im Quelltext.

Page 12: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 12

Prinzipien Prinzip 2: Trennung der Anliegen

Ziel ist eine Trennung der eigentlichen Anliegen von den Querschnittsaufgaben. Beispiel zur Sicherheitsprüfung:

public void changeSemester(Student student, int semester) { // Sicherheitsprüfung durchführen: Hat der aktuelle // Nutzer Administratorrechte? if (!currentUser.isAdmin()) { throw new AccessControlException("Illegal access by user"); } student.setSemester(semester); saveStudent(student);}

Viele andere Methoden sind im Projekt ähnlich aufgebaut. Die Sicherheitsprüfung ist eine Querschnittsaufgabe und hat somit ein anderes Anliegen als

das Ändern der Semesternummer gehört hier nicht in die Methode. Die Prüfung würde auch per Copy/Paste in viele Methoden eingefügt werden.

Page 13: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 13

Prinzipien Prinzip 2: Trennung der Anliegen

Beispiel zur Protokollierung:public long calculate() { // Aufruf protokollieren logger.log("Start"); long result = calculateSomethingVeryComplex(); logger.log("End"); return result;}

Die Protokollierung ist ebenfalls eine Querschnittsaufgabe und somit ein anderes Anliegen als die Berechnung gehört hier nicht in die Methode.

Weitere ähnliche Probleme: Eine bestehende Methode soll während des laufenden Programms verändert werden, indem ihr Aufruf an eine andere Methode umgeleitet wird. Selbstmodifizierende Programme???? Eine Anwendung kommt gleich im Kapitel zu Spring.

Weitere Querschnittsaufgaben: Validierung von Werten, Persistierung von Objekten in Datenbanken, Profiling von Programmen, …

Page 14: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 14

Prinzipien Prinzip 2: Trennung der Anliegen

Wie kommen solche Querschnittsaufgaben denn sonst in den Programmcode? Mittels aspekt-orientierter Programmierung (AOP) können Querschnittsaufgaben („Aspekte“)

automatisch zur Laufzeit oder Übersetzungszeit in Methoden eingefügt werden. AspectJ ist eine Implementierung für Java, die die Aspekte zur Laufzeit in den Bytecode

einfügt.

Aufgabe 1

Aufgabe 2

Aufgabe 3

Sicherheit

Fehlerbehandlung

Page 15: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 15

Prinzipien Prinzip 2: Trennung der Anliegen

Ein Aspekt besteht aus den drei rot markierten Teilen:

Advice: Welcher Code soll ausgeführt werden? Wann soll der Code ausgeführt werden (hier am Beispiel einer Methode)?

- before: bevor der Rumpf der Ziel-Methode betreten wird (z.B. für eine Sicherheitsprüfung oder den Start einer Zeitmessung)

- after: nachdem die Ziel-Methode verlassen wurde (z.B. für die Beendigung einer Zeitmessung)

aufruferMethode zielMethodeMethodenaufruf

Advice

Pointcut

Joinpoint

Page 16: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 16

Prinzipien Prinzip 2: Trennung der Anliegen

- after-returning: nachdem die Ziel-Methode erfolgreich beendet wurde (z.B. zum Speichern des veränderten Objektes)

- after-throwing: nachdem die Ziel-Methode durch eine Ausnahme beendet wurde (z.B. zur Speicherung des Fehlers)

- around: bevor die Ziel-Methode betreten und nachdem die Ziel-Methode verlassen wurde (z.B. für die Protokollierung von Aufrufen)

Joinpoint: Stelle, an der ein „Advice“ prinzipiell eingefügt wird. AspectJ unterstützt Methoden, Konstruktoren, Ausnahmen und Arrays. Beispiele:

in die Methode setX der Klasse Point: void Point.setX(int) bei Auftritt der Ausnahme ArrayOutOfBoundsException

Pointcut: Menge von Joinpoints zusammen mit der Angabe, wie deren Advices aktiv werden. Beispiele:

beim Aufruf jeder Methoden setX und setY der Klasse Point:call(void Point.setX(int)) || call(void Point.setY(int))

beim Auftreten der Ausnahme: handler(ArrayOutOfBoundsException)

Page 17: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 17

Prinzipien Prinzip 2: Trennung der Anliegen

Genaueres Beispiel anhand zweier sehr einfacher Klassen Fraction und Vector: (Projekt AspectJ)public class Fraction { private long counter; private long denominator; public Fraction(long counter, long denominator) { this.counter = counter; this.denominator = denominator; } public long getCounter() { return counter; } public void setCounter(long counter) { this.counter = counter; } public long getDenominator() { return denominator; } public void setDenominator(long denominator) { this.denominator = denominator; }}

Page 18: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 18

Prinzipien Prinzip 2: Trennung der Anliegen

public class Vector<E> { private Object[] values;

public Vector(int size) { values = new Object[ size ]; }

@SuppressWarnings("unchecked") public E getValue(int index) { return (E) values[ index ]; }

public void setValue(int index, E value) { values[ index ] = value; }}

Page 19: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 19

Prinzipien Prinzip 2: Trennung der Anliegen

Es wird hier ein Aspekt mit dem Namen ExampleAspect erstellt:public aspect ExampleAspect { pointcut setter() : call(void set*(..));

before(): setter() { System.out.println("##AJ## Vor Setter " + thisJoinPoint.getSignature()); }

after() returning: setter() { System.out.println("##AJ## Nach Setter " + thisJoinPoint.getSignature()); }}

Der Pointcut mit dem Namen setter verwendet einen Joinpoint: Dieser soll beim Aufruf jeder Setter-Methode (fängt mit set an) aktiv werden. Der Pointcut gilt für alle Setter-Methoden aller Klassen.

Die beiden Advices werden vor bzw. nach den Methodenaufrufen ausgeführt, die der Pointcut setter beschreibt.

Page 20: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 20

Prinzipien Prinzip 2: Trennung der Anliegen

Das mach der AspectJ-Compiler daraus (am Beispiel des Vektors, die Bruchklasse wird analog behandelt):public class Vector<E> { private Object[] values;

public Vector(int size) { values = new Object[ size ]; } @SuppressWarnings("unchecked") public E getValue(int index) { return (E) values[ index ]; }

public void setValue(int index, E value) { System.out.println("##AJ## Vor Setter void de.hska.iwii.i2.Vector.setValue(int, " + "Object)"); values[ index ] = value; System.out.println("##AJ## Nach Setter void de.hska.iwii.i2.Vector.setValue(int, " + "Object)"); }}

public aspect ExampleAspect { pointcut setter() : call(void set*(..));

before(): setter() { System.out.println("##AJ## Vor Setter " + thisJoinPoint.getSignature()); }

after() returning: setter() { System.out.println("##AJ## Nach Setter " + thisJoinPoint.getSignature()); }}

Page 21: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 21

Prinzipien Prinzip 2: Trennung der Anliegen

Ein Advice hat auch Zugriff auf die Übergabeparameter:public aspect ExampleAspect { pointcut fractionSetter(Fraction f): target(f) && (call(void setCounter(long)) || call(void setDenominator(long)));

before(Fraction f): fractionSetter(f) { System.out.println("##AJ## Vor Fraction-Setter: " + f); Object[] args = thisJoinPoint.getArgs(); for(Object arg: args) { System.out.println(" " + arg); } }}

Der Pointcut fängt Aufrufe der Methode setCounter und setDemoniator der Klasse Fraction ab.

Die Referenz auf das aktuelle Bruchobjekt wird dem Advice übergeben. Das Advice kann mit Hilfe einer API die Übergabeparameter auslesen. thisJoinPoint ist eine Referenz auf den Joinpoint, der den Aufruf der Advice verursacht

hat.

Page 22: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 22

Prinzipien Prinzip 2: Trennung der Anliegen

Zusammenfassung: Mit aspekt-orientierter Programmierung lassen sich Querschnittsaufgaben von den

eigentlichen Ausgaben trennen saubere Trennung der Anliegen Nachteil: etwas höherer Laufzeitaufwand

Verwendung in Eclipse: AspectJ über den Eclipse Marketplace herunterladen AspectJ-Projekt erstellen, dann wird der zusätzliche Compiler vor dem Aufruf des Kava-

Compilers aktiv. Der AspectJ-Compiler kann auch nachträglich zu einem Projekt hinzugefügt werden.

Page 23: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 23

Prinzipien Prinzip 3: Wiederholungen vermeiden

Wiederholungen vermeiden (Don’t repeat yourself): Eine identifizierbare Funktionalität eines Softwaresystems sollte innerhalb dieses Systems

nur einmal umgesetzt sein.

Was passiert, wenn man an verschiedenen Stellen ähnlichen Code hat? Aufspürung und Entfernung solcher Redundanzen

Beispiele: Statt fester Zahlen immer Konstanten oder Aufzähltypen im Programm verwenden:

Fragen wie „Welche Bedeutung hat die Zahl 5 im Quelltext“ lassen sich sonst schwer beantworten, besonders dann, wenn die 5 mehrere Bedeutungen hat (Anzahl Werktage in der Woche, Typ eines Werkstücks, …).

Häufig wiederkehrende Codestücke müssen in eigene Methoden verschoben werden. Copy/Paste!!!!

Page 24: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 24

Prinzipien Prinzip 4: Offen für Erweiterung, geschlossen für Änderung

Prinzip der Offenheit für Erweiterungen und Geschlossenheit für Änderungen (Open-Closed Principle):

Ein Modul soll für Erweiterungen offen sein:- Durch die Verwendung des Moduls zusammen mit Erweiterungsmodulen lässt sich

die ursprüngliche Funktionalität des Moduls anpassen.- Die Erweiterungsmodule enthalten nur die Abweichungen der gewünschten von der

ursprünglichen Funktionalität. Ein Modul soll für Änderungen geschlossen sein:

- Es sind keine Änderungen des Moduls notwendig, um es erweitern zu können.- Das Modul hat definierte Erweiterungspunkte, an die sich die Erweiterungsmodule

anknüpfen lassen.- Ziel: Änderungen an bereits verwendeten Modulen führen möglicherweise zu

Problemen, weil sich Anwendungen auf Eigenschaften verlassen.

Page 25: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 25

Prinzipien Prinzip 4: Offen für Erweiterung, geschlossen für Änderung

Beispiel: Taste („Button“) in einer grafischen Benutzungsoberfläche Wie wird ein Modul informiert, wenn die Taste gedrückt wird? Änderung am Button:

- Für jeden Einsatz muss die Button-Klasse verändert werden keine Änderung am Original Kopie der Klasse mit Änderungen

- Nicht sinnvoll implementierbar! Lösung:

- Das Modul, das informiert werden möchte, meldet sich am Button an und wird bei einem Tastendruck informiert.

- Erweiterung: Jemand kann sich anmelden (registrieren). Konzept: Beobachter-Muster (schon bekannt vom JavaFX-Abschnitt her)

Page 26: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 26

Prinzipien Prinzip 5: Trennung der Schnittstelle von der Implementierung

Prinzip der Trennung der Schnittstelle von der Implementierung (Program to Interfaces): Jede Abhängigkeit zwischen zwei Modulen sollte explizit formuliert und dokumentiert

sein. Ein Modul sollte immer von einer klar definierten Schnittstelle des anderen Moduls

abhängig sein und nicht von der Art der Implementierung der Schnittstelle. Die Schnittstelle eines Moduls sollte getrennt von der Implementierung betrachtet

werden können. siehe Beispiel von der instabilen Basisklasse

Schnittstelle beinhaltet: bereitgestellte Operationen und deren Parameter komplette Spezifikation, die festlegt, welche Funktionalität ein Modul anbietet

Page 27: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 27

Prinzipien Prinzip 5: Trennung der Schnittstelle von der Implementierung

Beispiel: Ein Modul möchte Log-Meldungen ausgeben. Dummy-Ansatz: Textmeldungen auf der Konsole ausgeben Besser:

- Das Modul verwendet ein Log-Modul.- Das Log-Modul wird als Schnittstelle bzw. als Klasse mit nur abstrakten Methoden

implementiert.- Alle Methoden des Log-Moduls besitzen ein genau definiertes Verhalten.

Vorteil:- Es können beliebige Log-Module verwendet werden: Datenbank-Speicherung,

Textdatei, Konsole, …

Page 28: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 28

Prinzipien Prinzip 5: Trennung der Schnittstelle von der Implementierung

Die Anwendungsklasse kennt nicht die konkrete Implementierung, sondern nur deren Schnittstelle:

<<interface>>AbstractLogger

+info(message: String)+error(message: String)

ConsoleLogger

+info(message: String)+error(message: String)

FileLogger

+info(message: String)+error(message: String)

Anwendungsklasseverwendet

Page 29: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 29

Prinzipien Prinzip 6: Umkehr der Abhängigkeiten

Abstraktion beschreibt das in einem gewählten Kontext Wesentliche eines Gegenstandes oder eines

Begriffes. blendet Details aus, die für eine bestimmte Betrachtungsweise nicht relevant sind. ermöglicht es, unterschiedliche Elemente zusammenzufassen, die unter einem

bestimmten Gesichtspunkt gleich sind. Beispiel:

Modul, das Börsenkurse anzeigt Die Kurse stammen aus dem Internet und werden mit JavaFX angezeigt. Lösung mit einem klassischen Top/Down-Entwurf nach Prinzip der „einzigen

Verantwortung“ und Prinzip „Trennung der Anliegen“:

KursanzeigeJavaFX-Modul

HTTP-Modul

verwendet

Page 30: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 30

Prinzipien Prinzip 6: Umkehr der Abhängigkeiten

Probleme: Die Daten sollen nach einer Erweiterung auch aus anderen Quellen (Datenbank, …)

kommen. Die Daten sollen auch anders visualisiert werden. Diese Anforderungen können mit diesem Top/Down-Ansatz nur schwer umgesetzt werden.

Lösung: Umkehrung der Abhängigkeiten Prinzip der Umkehr der Abhängigkeiten (Dependency Inversion Principle):

Der Entwurf der Module stützt sich auf Abstraktionen, nicht auf konkrete Implementierungen.

Page 31: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 31

Prinzipien Prinzip 6: Umkehr der Abhängigkeiten

Abstraktion von konkreten Modulen: Für die HTTP- und Datenbankmodule wird ein abstraktes Datenmodul erstellt. Für die Ausgabe wird ein abstraktes GUI-Modul erstellt.

Kursanzeige

JavaFX-Modul

HTTP-Modulverwendet Datenbank-Modul

SWT-Modul

Daten-Modul

GUI-Modul

stellt bereit

Module, die konkreteImplementierungen nutzen

abstrakte Zwischenschicht Genutzte Module, die konkreteImplementierungen bereitstellen

UmgekehrteAbhängigkeiten

Richtung derAbhängigkeit

Richtung derAbhängigkeit

Page 32: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 32

Prinzipien Prinzip 6: Umkehr der Abhängigkeiten

Vorteile des Prinzips: Bei Änderungen an den konkreten, genutzten Modulen sind selten Änderungen an den

nutzenden Modulen erforderlich. Weitere konkrete Module lassen sich leicht ergänzen und wie existierende nutzen.

Ergebnis des Prinzips:Konkrete Modulesind von abstraktenund nicht von anderenkonkreten Modulenabhängig.

Kursanzeige

JavaFX-Modul

HTTP-Modul

verwendet

Datenbank-Modul

SWT-Modul

Daten-Modul

GUI-Modul

stellt bereit

Abstraktionen Konkrete Implementierungen

Page 33: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 33

Prinzipien Prinzip 7: Umkehr des Kontrollflusses

Prinzip 7 ist eine Anwendung des „Prinzips der Umkehr der Abhängigkeiten“ Umkehrung des Kontrollflusses (Inversion of Control):

Ein spezifisches Modul wird von einem mehrfach verwendbaren Modul aufgerufen. Hollywood-Prinzip: „Don’t call us, we’ll call you“.

Beispiel: Die Behandlung von Ereignissen wird in einem mehrfach verwendbaren Modul

bereitgestellt. Das mehrfach verwendbare Modul übernimmt die Aufgabe, die anwendungsspezifischen

Module aufzurufen, wenn bestimmte Ereignisse stattfinden. Die spezifischen Module rufen also die mehrfach verwendbaren Module nicht auf, sie

werden stattdessen von ihnen aufgerufen.

ButtonGUI-Modul

anwendungsspezifisch mehrfach verwendbar

ruft auf

Page 34: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 34

Prinzipien Prinzip 8: Mache es testbar

Ziel des Prinzips: Konstruktion der Software, so dass sie leichter automatisch zu testen ist. Unit-Tests:

Ein Unit-Test ist ein Teil eines größeren Testprogramms, das die Umsetzung einer Anforderung an ein Modul überprüft.

Unit-Tests können automatisiert bei der Übersetzung der Software laufen, um Fehler schnell zu erkennen.

Häufig hilfreich: Mock-Objekte Mock-Objekte:

Platzhalter für echte Objekte, um das Testen zu erleichtern. Beispiele: Ein Mock-Objekt, dass

- statt einer langsamen Datenbank eingesetzt wird.- statt indeterministischer Objekte verwendet wird.

Konsequenz: Die Forderung nach Testbarkeit verändert das Design. Mock-Objekte sind ein Kandidat für „Umkehr der Abhängigkeiten“.

Page 35: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 35

Verbindung von Modulen Übersicht

Typinfo.,I/O

Annota-tionen

Laufzeit-typinfo.

Ein-,Ausgabe

Entwurf Prinzipien Verbindungvon Modulen OSGiSpring

GrafischeOberflä-

chenÜbersicht Layouts Widgets Grafik-

operationenGrafik-

widgetsEffekte,

AnimationenOffenePunkteEreignisse

Daten-strukturen ADTs Elementare

DatenstrukturenHash-

tabellen Bäume GraphenIteratorenDatenstrukturenin Java

Page 36: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 36

Verbindung von Modulen Motivation

Wie kann die Erstellung von Modulen von deren Verknüpfung getrennt werden? Wie lassen sich unterschiedliche Modulzusammenstellungen leicht herstellen? Ziel: Die Kopplung von Modulen erfolgt über ein separates Modul.

Page 37: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 37

Verbindung von Modulen Java-Beans

Die Java-SE kennt bereits den Begriff der Komponente: Bean Eigenschaften einer Bean (soweit diese für die Vorlesung relevant sind):

ein parameterloser Konstruktor Getter- und Setter-Methoden für Attribute, die sich am besten an den Standard zur

Namensvergabe halten. Beispiel:

- Attribut: private int age- Getter: public int getAge()- Setter: public void setAge(int age)- Name der Eigenschaft („property“): age

Ausnahme boolean-Attribut:- Attribut: private boolean retired- Getter: public boolean isRetired()- Setter: public void setRetired(boolean retired)- Name der Eigenschaft („property“): retired

Page 38: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 38

Verbindung von Modulen Java-Beans

Weitere Eigenschaften, die für die Vorlesung nicht relevant sind: Beans kennen Standard-Ereignisse, die bei Änderungen von Attributen ausgelöst werden

(PropertyChangeEvent, VetoableChangeEvent). Beans können eigene Ereignistypen definieren. Beans können sich durch Bean-Info-Klassen selbst beschreiben. Es gibt eine API, mit der Beans zur Laufzeit untersucht werden können

(java.beans.Introspector).

JavaFX setzt stark auf den Bean-Ansatz, um Eigenschaften verschiedener Objekte zu koppeln (siehe auch Animation).

Page 39: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 39

Verbindung von Modulen

Fragestellungen: Wie sollen Module gekoppelt (verbunden) werden? Wer macht das? Soll jedes Modul seine notwendigen Abhängigkeiten selbst herstellen? Problem: Je nach Kunden, auszuliefernder Version und Zustand (Test/Betrieb) der

Anwendung sind unterschiedliche Kopplungen sinnvoll.

M1

M2

M3

M4

M5

M6M7

Betrieb (ohne M7)

M1

M3

M4

M5

M6M7

Test (ohne M5)

M2

Page 40: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 40

Verbindung von Modulen

Weitere Probleme: Je nach Konfiguration sollen die Module unterschiedliche Parameter erhalten (andere

Datenbank, andere Benutzeranmeldung, …). Im komplexen Graphen von Abhängigkeiten entsteht das Problem der

Initialisierungsreihenfolge der Module.

Lösungsidee („Trennung der Schnittstelle von der Implementierung“): Angebot: Die Module geben Schnittstellen nach außen bekannt, die andere Module

nutzen dürfen.

Nachfrage: Module definieren die Schnittstellen, die sie von anderen Modulen benötigen.

Modul 1 I1

Modul 2 I1

Page 41: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 41

Verbindung von Modulen

Ein externes Framework verknüpft automatisch Angebot und Nachfrage: keine direkte Kopplung durch die Module selbst

Anmerkung: „Schnittstelle“ muss nicht zwangsläufig ein Interface in Java sein. Es ist lediglich eine definierte öffentliche Schnittstelle, die genutzt werden darf:

- Java-Interfaces- Klassen- abstrakte Klassen

Modul 1 I1 Modul 2

Framework

Page 42: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 42

Verbindung von Modulen

Beispiel-Module mit öffentlichen Schnittstellen:

Modul

Schnittstelle

K1

K2

K3

I1 I2

Modul

Schnittstelle

K4

K5

K6

I4

K4 verwendet K2,kennt aber nur dessenSchnittstelle I2

Page 43: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 43

Verbindung von Modulen

Die folgenden Einführungen verwendet ein kleines Beispiel: Es können Börsenkurse von einem Yahoo-Server abgeholt werden. Die Kurse können aber auch aus einer Simulation stammen. Das Abholen erfolgt zeitgesteuert in einem festen Takt. Die Ausgabe kann auf verschiedene Ziele erfolgen. Hier wird nur die Konsole eingesetzt.

Hinweis: Den Schnittstellennamen ist ein „I“ vorangestellt. Das ist in Java unüblich, stammt aber aus der „Eclipse Rich Client Platform“, für die das Beispiel ursprünglich entstanden ist.

Page 44: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 44

Verbindung von Modulen

Modulübersicht ohne Verknüpfungen (nicht alle Attribute sichtbar):

Aufgabe: zeitgesteuertes Abholen aus Quellen und Speicherung/Anzeige in Zielen

Basisfunktionen

Quelle: Simulation Quelle: reale Kurse

Speicherung

Abholen

Ziel: Anzeige Ziel: Datenbank

Page 45: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 45

Verbindung von Modulen

Beispiel: Test mit simulierten Daten, die auf der Konsole ausgegeben werden

Basisfunktionen

Quelle: Simulation

Speicherung

Abholen

Ziel: Anzeige

Page 46: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 46

Verbindung von Modulen

Beispiel: Betrieb mit realen Daten, die in die Datenbank geschrieben werden

Basisfunktionen

Quelle: reale Kurse

Speicherung

Abholen

Ziel: Datenbank

Page 47: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 47

Verbindung von Modulen

Beispiel: Betrieb mit realen Daten, die in die Datenbank geschrieben und ausgegeben werden

Basisfunktionen

Quelle: reale Kurse

Speicherung

Abholen

Ziel: Anzeige Ziel: Datenbank

Page 48: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 48

Verbindung von Modulen

Das Ziel ist es also, mindestens die veränderlichen Modulverknüpfungen separat zu konfigurieren:

Basisfunktionen

Quelle: Simulation Quelle: reale Kurse

Speicherung

Abholen

Ziel: Anzeige Ziel: Datenbank

Page 49: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 49

Verbindung von Modulen Angebot

Angebot: Es muss erkennbar sein, welche Klassen als Dienste anderen zur Verfügung stehen.

Page 50: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 50

Verbindung von Modulen Nachfrage

Nachfrage: Die Klassen, die Dienste in Anspruch nehmen wollen, müssen ihren Bedarf kennzeichnen.

Page 51: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 51

Modularisierung mit Spring Übersicht

Typinfo.,I/O

Annota-tionen

Laufzeit-typinfo.

Ein-,Ausgabe

Entwurf Prinzipien Verbindungvon Modulen OSGiSpring

GrafischeOberflä-

chenÜbersicht Layouts Widgets Grafik-

operationenGrafik-

widgetsEffekte,

AnimationenOffenePunkteEreignisse

Daten-strukturen ADTs Elementare

DatenstrukturenHash-

tabellen Bäume GraphenIteratorenDatenstrukturenin Java

Page 52: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 52

Modularisierung mit Spring Motivation

Wie verbindet Spring einzelne Module? Wie können externe Abhängigkeiten oder Konfigurationen den Modulen übergeben

werden?

Page 53: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 53

Modularisierung mit Spring Grundlagen

Spring kennt nicht den Begriff des Moduls. Es baut intern einen Abhängigkeitsgraphen zwischen Objekten auf und initialisiert sie in der richtigen Reihenfolge. Es können auch Konfigurationswerte z.B. aus Dateien eingetragen werden.

Die Lebenszyklen der von Spring verknüpften Klassen verwaltet Spring: kein manuelles Erzeugen mit new irgendwo im Code!

M1

M2

M3

M4

M5

M6M7

Spring-Container

Die Module M1 bis M7 werdenvon Spring erzeugt undverknüpft (rote Linien).Innerhalb der Module dürfenaber mit new eigene Objekteerzeugt werden.

Page 54: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 54

Modularisierung mit Spring Dependency Injection

Die Abhängigkeiten werden „von außen“ (durch das Spring-Framework) injiziert „Dependency Injection“ (auch kurz „DI“).

Es gibt drei Möglichkeiten, Klassen und deren Abhängigkeiten zu beschreiben (können auch gemischt verwendet werden):

XML-Datei Annotationen im Quelltext Java-Code

Die von Spring verwalteten Objekte besitzen auch einen Lebenszyklus, der hier nicht betrachtet wird.

Wichtigste Quellen für Spring: Eclipse mit speziellen Plugins:

http://www.springsource.com/products/springsource-tool-suite-download Nur das Framework: http://www.springsource.org/spring-framework Es gibt viele Erweiterungen für Spring (werden hier nicht verwendet).

Page 55: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 55

Modularisierung mit Spring Dependency Injection: XML-Konfiguration

Die Konfigurationsdatei beinhaltet: Angebote: Namen und Klassen der zu erzeugenden Komponenten. Die Komponenten

werden Beans genannt. Gültigkeitsbereiche (spielt hier keine Rolle, wichtig z.B. für Server-Anwendungen) Initialwerte für die Beans Nachfragen: Verbindungen der Beans untereinander

Die Klassen sind reine Java-Klassen (POJOs = Plain Old Java Objects). Die Konfigurationsdatei kann einen beliebigen Namen besitzen.

Das vollständige Beispiel finden Sie im Projekt Spring StockQuotes with XML.

Page 56: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 56

Modularisierung mit Spring Dependency Injection: XML-Konfiguration

Präambel der Konfigurationsdatei applicationContext.xml für das Beispiel:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

Es sind weitere Namensräume vorhanden, die hier keine Rolle spielen.

Page 57: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 57

Modularisierung mit Spring Dependency Injection: XML-Konfiguration

Definition von Modulen (Beans):<bean id="stockQuotesSimulation" class="de.hska.iwii.i2.simulation.StockQuotesSimulation"/>

id ist der logische Name, unter dem die Bean angesprochen wird (= Modulname). Normalerweise wird der Klassenname mit kleinem Anfangsbuchstaben verwendet.

class ist die Klasse, die diese Bean implementiert. Beim Erzeugen wird der Standardkonstruktor verwendet. Es wird nur ein einziges Bean-Objekt erzeugt.

Page 58: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 58

Modularisierung mit Spring Dependency Injection: XML-Konfiguration

Die Klasse zur Konsolenausgabe soll im Konstruktor die Anzahl Nachkommastellen, mit denen die Zahlen formatiert werden, übergeben bekommen. Quellcodefragment der Klasse:public class ConsoleWriter implements IWriter { public ConsoleWriter(int fractionDigits) { // ... }

@Override public void write(List<StockData> values) { // ... }}

Die Konstruktorargumente können als einzelne constructor-arg-Tags in der Bean-Spezifikation angegeben werden:<bean id="consoleWriter" class="de.hska.iwii.i2.output.ConsoleWriter"> <constructor-arg value="2"/></bean>

Der Wert "2" wird automatisch in einen int-Wert konvertiert.

Attribut wird demKonstruktorübergeben

Page 59: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 59

Modularisierung mit Spring Dependency Injection: XML-Konfiguration

Der Timer ist etwas komplizierter aufgebaut: Er bekommt die Zeitabstände zwischen zwei Abholvorgängen, die Referenz auf die Datenquelle und die Referenzen auf die Datenziele

per XML-Konfiguration übergeben.

private IStockQuotes source;

private IWriter[] destinations;oderprivate List<IWriter> destinations;

private int delay;

Page 60: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 60

Modularisierung mit Spring Dependency Injection: XML-Konfiguration

Quellcodefragment der Klasse:public class StockQuotesTimer { // Zeitverzögerung zwischen zwei Abholvorgängen in msec private int delay;

// Aktuell verwendete Datenquelle private IStockQuotes source; // eine Referenz

// Alle Datenziele private IWriter[] destinations; // viele Referenzen

public void setDelay(int delay) { this.delay = delay; }

public void setSource(IStockQuotes source) { this.source = source; } // Oder List<IWriter> destinations public void setDestinations(IWriter[] destinations) { this.destinations = destinations; }

Page 61: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 61

Modularisierung mit Spring Dependency Injection: XML-Konfiguration

Bean-Definition:<bean id="stockQuotesTimer" class="de.hska.iwii.i2.stockquotestimer.StockQuotesTimer" p:delay="1000"> <property name="destinations"> <list> <ref bean="consoleWriter"/> </list> </property> <property name="source" ref="stockQuotesSimulation"/></bean>

Das Objekt wird mit dem Standardkonstruktor erzeugt. p:delay: Die Eigenschaft („Property“) delay wird durch den Aufruf von setDelay

eingetragen. p:delay ist eine Kurzform für <property name="delay" value="1000"/>.

Page 62: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 62

Modularisierung mit Spring Dependency Injection: XML-Konfiguration

Die Referenz auf das Bean consoleWriter wird mit der Methode setDestinations übergeben.

<list>: Es wird eine Liste von Daten übergeben. Die Liste hat hier nur einen Eintrag. ref verweist auf die einzige Bean, die übergeben

werden soll. Die Referenz auf das Bean stockQuotesSimulation wird mit der Methode

setSource eingetragen.

Anmerkung zu <list>: Es können prinzipiell auch Hashtabellen übergeben werden, wenn eine Methode Map-Objekte als Parameter erwartet:<map> <entry key="key1" value-ref="bean1"/> <entry key="key2" value-ref="bean2"/></map>

Der Schlüssel darf auch eine referenzierte Bean sein: key-ref="bean1" Der Wert kann ein fest verdrahteter Wert sein: value="1000" Statt einer <map> kann auch ein <set> verwendet werden (Syntax wie <list>).

Page 63: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 63

Modularisierung mit Spring Dependency Injection: XML-Konfiguration

Jetzt muss die Konfiguration noch gelesen werden, hier in main:public class Starter { public static void main(String[] args) throws IOException { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); StockQuotesTimer timer = ctx.getBean(StockQuotesTimer.class); timer.setStockQuotesIndex("DJI"); timer.start(); }}

ClassPathXmlApplicationContext: Aufgaben: Lädt die übergebene XML-Datei aus dem Klassenpfad der Anwendung, erzeugt die erforderlichen Objekte bei Bedarf und stellt deren Beziehungen her.

ctx.getBean(Klasse): Erzeugt das Timer-Objekt. Dadurch werden die abhängigen Objekte auch erzeugt und verknüpft.

Die Timer-Methoden sind selbst implementiert. Sie wählen einen Börsenindex aus und starten das zeitgesteuerte Abholen.

Page 64: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 64

Modularisierung mit Spring Dependency Injection: Annotationen

Die Annotationen: kennzeichnen die zu erzeugenden Komponenten und geben ihnen optional einen

alternativen Namen. besitzen Gültigkeitsbereiche (spielen auch hier keine Rolle) bieten Initialwerte für die Beans verbinden Beans untereinander

Die Klassen sind keine reinen Java-Klassen (POJOs) mehr. Annotationen dürfen mit XML-Konfigurationsdateien gemischt eingesetzt werden. Es werden unterschiedliche Annotationen unterstützt:

Spring-eigene JSR-330: In diesem Standard sind Annotationen definiert, die aber nicht den vollen

Umfang der Spring-Annotationen abdecken. Vorteil: Unabhängigkeit von Spring, auch andere DI-Frameworks können verwendet werden.

Das vollständige Beispiel finden Sie im Projekt Spring StockQuotes with Annotations.

Page 65: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 65

Modularisierung mit Spring Dependency Injection: Annotationen

Definition von Modulen (Beans) durch die Annotation:@Componentpublic class StockQuotesSimulation extends AbstractStockQuotes {

@Component markiert diese Klasse, damit Spring dessen Objekte als Anbieter per „Dependency Injection“ anderen Komponenten übergeben kann. Der Name der Komponente entspricht dem Klassennamen mit kleinem Anfangsbuchstaben (hier stockQuotesSimulation).

Ein abweichender Namen kann mit @Qualifier("name") angegeben werden. Beim Erzeugen wird der Standardkonstruktor verwendet. Es wird nur ein einziges Bean-Objekt je Gültigkeitsbereich erzeugt.

Page 66: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 66

Modularisierung mit Spring Dependency Injection: Annotationen

Wie sieht es mit der Übergabe von externen Konfigurationsparametern an einen Konstruktor oder eine Methode aus?@Componentpublic class ConsoleWriter implements IWriter { private int fractionDigits; public ConsoleWriter(int fractionDigits) { /* ... */ } // ...}

Nicht mit Annotationen XML-Konfiguration oder Expression Language verwenden. Attribute können aber direkt initialisiert werden:

@Componentpublic class ConsoleWriter implements IWriter { @Value("2") private int fractionDigits; public ConsoleWriter() { /* ... */ } // ...}

Ziemlich sinnlos mit Expression Language aber doch sehr mächtig (kommt wirklich bald).

Page 67: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 67

Modularisierung mit Spring Dependency Injection: Annotationen

Das Beispiel mit @Value klappt dummerweise nicht immer so wie erwartet:@Componentpublic class ConsoleWriter implements IWriter { @Value("2") private int fractionDigits;

public ConsoleWriter() { System.out.println(fractionDigits); // Ausgabe 0!! } // ...}

Was passiert hier? Es wird erst das Objekt mit dem Standardkonstruktor erzeugt. Dann werden per „Dependency Injection“ die Abhängigkeiten und auch die Werte

eingetragen. fractionDigits hat also erst nach der Erzeugung den Wert 2. Probleme:

Wann ist das Objekt denn nun fertig initialisiert? Wie kann der Entwickler auf die abgeschlossene Initialisierung reagieren?

Page 68: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 68

Modularisierung mit Spring Dependency Injection: Annotationen

Der Entwickler kann eine Methode mit @PostConstruct annotieren. Sie wird nach der Initialisierung aufgerufen „ersetzt“ den Konstruktor.@Componentpublic class ConsoleWriter implements IWriter { @Value("2") private int fractionDigits;

@PostConstruct private void init() { System.out.println(fractionDigits); // Ausgabe 2 } // ...}

Ablauf mit Spring:1. Das Objekt wird erzeugt, Konstruktor aufgerufen.2. Die Abhängigkeiten und Werte werden eingetragen.3. Die mit @PostConstruct annotierte Methode wird aufgerufen.

Page 69: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 69

Modularisierung mit Spring Dependency Injection: Annotationen

Auflösen der Modulabhängigkeiten: anhand der Klasse der Abhängigkeit anhand des Namens der abhängigen Komponente anhand von Konstruktorparametertypen (soll hier nicht gezeigt werden)

public class StockQuotesTimer { // Zeitverzögerung zwischen zwei Abholvorgängen in msec @Value("2000") private int delay;

// Aktuell verwendete Datenquelle @Autowired private IStockQuotes source; // eine Referenz

// Alle Datenziele @Autowired private IWriter[] destinations; // viele Referenzen

Die Setter-Methoden sind nicht mehr erforderlich. Mit @Autowired werden hier alle Objekte übergeben, die die Schnittstellen

IStockQuotes bzw. IWriter implementieren (Auflösung anhand der Klasse).

Page 70: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 70

Modularisierung mit Spring Dependency Injection: Annotationen

Was passiert, wenn es mehrere Quellen (Simulation und Yahoo) gibt? Ausnahme durch Spring (der Timer erwartet nur eine Quelle) Es kann eine Quelle direkt durch Angabe ihres Namens ausgewählt werden (Auflösung

anhand des Namens). Hier wird direkt die Simulation gewählt:@Autowired@Qualifier("stockQuotesSimulation")private IStockQuotes source;

Nachteil: Die Abhängigkeit kann schlecht „von außen“ gesteuert werden. Was passiert, wenn es keine Quelle oder kein Ziel gibt?

Ausnahme Wenn das aber vorkommen darf, dann kann die Abhängigkeit als optional markiert

werden:@Autowired(required=false)private IStockQuotes source;

Die automatische „Verdrahtung“ mit @Autowired gibt es übrigens auch in der XML-Konfiguration siehe Spring-Dokumentation.

Page 71: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 71

Modularisierung mit Spring Dependency Injection: Annotationen

Statt direkt Attribute zu „injizieren“, funktioniert das auch über Setter-Methoden und Konstruktoren:

Setter:@Autowiredpublic void setCustomer(Customer cust) {

Die Methode wird automatisch nach der Erzeugung aufgerufen. Konstruktor:

@Autowiredpublic Shop(Customer cust) {

Vorteile dieser Ansätze: Es sind weitere Aktionen im Setter bzw. dem Konstruktor möglich. Hinweis zum Standard JSR-330:

Statt @Autowired wird @Inject verwendet. Statt @Qualifier wird @Named verwendet. Statt @Component wird @Named (mit oder ohne Namensangabe) verwendet.

Die Annotationen sind ähnlich, aber nicht exakt gleich.

Page 72: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 72

Modularisierung mit Spring Dependency Injection: Annotationen

Jetzt muss die Konfiguration noch gelesen werden, hier in main:public class Starter { public static void main(String[] args) throws IOException { String package = Starter.class.getPackage().getName(); ApplicationContext ctx = new AnnotationConfigApplicationContext(package); StockQuotesTimer timer = ctx.getBean(StockQuotesTimer.class); timer.setStockQuotesIndex("DJI"); timer.start(); }}

AnnotationConfigApplicationContext: Aufgaben: untersucht die Klassen aus dem übergebenen Paket sowie seinen Unterpaketen auf

Annotationen erzeugt die erforderlichen Objekte bei Bedarf und stellt deren Beziehungen her.

Page 73: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 73

Modularisierung mit Spring Dependency Injection: Java-basiert

Nachteil der Annotation-Variante ist die fehlende Trennung der Anliegen: Annotationen gehören zur Infrastruktur. Die Klassen implementieren die Anwendungslogik und sollten als reine Java-Klassen

(POJOs) keinen Bezug zur Infrastruktur aufweisen. Die Java-basierte Konfiguration umgeht das Problem, indem eine oder mehrere

Konfigurations-Klassen die Beans erzeugen. Am Beispiel:@Configurationpublic class StockQuotesConfiguration { @Bean public StockQuotesTimer timer() { StockQuotesTimer timer = new StockQuotesTimer(stockQuotesSimulation()); timer.addDestination(consoleWriter()); return timer; }

@Bean public IStockQuotes stockQuotesSimulation() { return new StockQuotesSimulation(); }

Page 74: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 74

Modularisierung mit Spring Dependency Injection: Java-basiert

@Bean public IWriter consoleWriter() { return new ConsoleWriter(2); }}

Spring stellt auch bei mehrfachen Aufrufen der Bean-Methoden sicher, dass immer nur ein Objekt erzeugt wird. Wie soll das funktionieren?

Spring fügt zur Laufzeit Code in den Bytecode ein, der die Aufrufe abfängt, um zu kontrollieren, wie oft ein Objekt erzeugt wird mit AOP möglich (Umleitung von Methodenaufrufen zur Laufzeit).

Annotationen: @Configuration markiert eine Klasse, die Beans erzeugen kann. @Bean kennzeichnet die Methoden, die von Spring aufgerufen werden, um Beans

zurückzugeben. Der Methodenname wird als Bean-Name verwendet. Alle anderen Klassen sind normale POJOs (siehe XML-Beispiel). Die Hauptklasse Starter zum Start unterscheidet sich nicht von der aus dem Annotations-

Beispiel.

Page 75: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 75

Modularisierung mit Spring Dependency Injection: Vergleich der Ansätze

Vergleich der der Konfigurationsansätze: XML-Datei

+ sehr flexibel und mächtig, Konfiguration außerhalb des Programms- XML-Hölle (kein Bezug zum Quelltext erkennbar, viel Code, Änderungen im Quelltext

müssen in der XML-Datei nachgezogen werden) Annotationen:

+ sehr kompakte Schreibweise, Verdrahtung ist direkt im Quelltext erkennbar- Vermischung verschiedener Anliegen in einer Klasse- Die Verwendung von Konfigurationsdateien muss trotzdem separat erfolgen.

Java-basiert:+ saubere Trennung der Anliegen, Konfiguration mit „normalen“ Java-Sprachmitteln- Anhand des Quelltextes ist nicht mehr ersichtlich, welche Klassen irgendwo

verwendet werden.- Die Verwendung von Konfigurationsdateien muss trotzdem separat erfolgen.

Page 76: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 76

Modularisierung mit Spring Expression Language

Expression Language: Die Eigenschaften in der XML-Datei oder die @Value-Annotation können nicht nur

einfache Werte aufnehmen. Sie erlauben recht komplexe Ausdrücke in einer „Expression Language“.

Verwendung:"#{bean.property}": Der Ausdruck ist ein String, der immer mit #{ und } eingefasst wird.

Beispiele: "#{bean.property}": bean ist die ID (der Name) einer Bean, property der

Name eines Attributs der Bean, das mit dem Getter getProperty gelesen wird. "#{bean1.sum * bean2.counter}": berechnet das Produkt der beiden Bean-

Attribute "#{bean.firstname + " " + bean.lastname}": erzeugt einen String,

bestehend aus Vor- und Nachnamen (getrennt durch ein Leerzeichen). "#{bean.method()}": Das Ergebnis ist der Wert, den die Methode method

zurückgibt.

Page 77: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 77

Modularisierung mit Spring Expression Language

"#{(bean.property > 0 && !bean1.total > 0) ? 42 : 66}": bedingter Ausdruck. Achtung in einer XML-Datei so nicht möglich. Daher können auch Operatorennamen verwendet werden:"#{(bean.property gt 0 and not bean1.total gt 0) ? 42 : 66}"

Der Operation T() erlaubt den Zugriff auf Typen (Klassen). Das ist für statische Attribute und Methoden erforderlich:

"#{T(java.lang.Math).PI": liest das statische Attribut PI der Klasse Math aus. "#{T(java.lang.Math).random()": ruft die statische Methode random() der

Klasse Math auf. Weitere komplexe Ausdrücke, auch in Zusammenhang mit Collection-Klassen sind möglich

siehe Spring-Dokumentation.

Page 78: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 78

Modularisierung mit Spring Fazit

Zusammenfassung: Spring wird sehr häufig für Server-Anwendungen verwendet. Mit JSF (Java Server Faces) können in der XHTML-Seite z.B. direkt Spring-Beans mit der

Expression Language angesprochen werden. Spring bietet viele Module, die für eigene Anwendungen nur noch konfiguriert werden

müssen (Authentifizierung, Autorisierung, Datenbankanbindung, …).

Page 79: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 79

Modularisierung mit OSGi Übersicht

Typinfo.,I/O

Annota-tionen

Laufzeit-typinfo.

Ein-,Ausgabe

Entwurf Prinzipien Verbindungvon Modulen OSGiSpring

GrafischeOberflä-

chenÜbersicht Layouts Widgets Grafik-

operationenGrafik-

widgetsEffekte,

AnimationenOffenePunkteEreignisse

Daten-strukturen ADTs Elementare

DatenstrukturenHash-

tabellen Bäume GraphenIteratorenDatenstrukturenin Java

Page 80: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 80

Modularisierung mit OSGi Motivation

Wie verbindet OSGi einzelne Module? Wie können Module dynamisch zur Laufzeit geladen oder ausgetauscht werden?

Page 81: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 81

Modularisierung mit OSGi Einführung

Spring weist einige kleinere Nachteile auf: Es kennt den Begriff des „Moduls“ nicht. Es werden lediglich Abhängigkeiten zwischen

Klassen bzw. zu Schnittstellen beschrieben. Die Konfigurationen sind statisch:

- Die „Module“ lassen sich nicht zur Laufzeit austauschen.- Es wird keine Versionierung unterstützt: Spring ist nicht in der Lage, ein „Modul“ in

verschiedenen Versionen zur selben Zeit laufen zu lassen. OSGi wählt einen anderen Ansatz, der die o.g. Defizite nicht aufweist. OSGi (früher: Open Services Gateway initiative, jetzt ein eigenständiger Name) wurde

ursprünglich für die Gebäudesystemtechnik entworfen. Nach der Standardisierung (siehe http://www.osgi.org/) hat OSGi Einzug in viele Bereiche

gehalten: Smartphones Automobil-Bereich (z.B. im 5er BMW für Telematik und Unterhaltung) Desktop-Anwendungen (hauptsächlich Eclipse) Serverseitige Dienste

Page 82: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 82

Modularisierung mit OSGi Einführung

Was bietet OSGi? Modularisierung:

Ein Bundle (= ein Plugin, = ein Modul) besteht aus vielen Paketen. Es wird deklarativ festgelegt,

- welche Pakete die öffentliche Schnittstelle des Bundles darstellen und- welche Abhängigkeiten dieses Bundle von anderen hat.

Auf interne Pakete kann nicht zugegriffen werden jedes Bundle besitzt einen eigenen Classloader.

Jedes Bundle besitzt eine Version.- Ein Bundle kann von einer bestimmten Version oder einem Versionsbereich eines

anderen Bundles abhängig sein.- Es kann ein Bundle in unterschiedlichen Versionen parallel verwendet werden.

Bundles lassen sich zur Laufzeit austauschen, ohne die komplette Anwendung stoppen zu müssen.

Page 83: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 83

Modularisierung mit OSGi Einführung

Dienstorientiertes („service oriented“) Programmiermodell: Ein Modul stellt lediglich Schnittstellen, aber keine konkreten Implementierungen nach

außen zur Verfügung. Die Schnittstellen mit ihren Implementierungen werden als Dienste in einer zentralen

„Registry“ hinterlegt. Soll ein Dienst verwendet werden, dann wird versucht, aus der „Registry“ die

Schnittstellenreferenz auszulesen. Der Anwender eines Moduls weiß gar nicht, welches Bundle den gesuchten Dienst zur

Verfügung stellt OSGi löst die Abhängigkeiten auf. Der OSGi-Standard definiert Dienste (Services), die allen anderen Modulen zur Verfügung

stehen: Logging HTTP-Zugriffe (einfacher Web-Server als Dienst) I/O-Zugriffe (Einführung neuer Protokolle) zentrale Dienstkonfiguration durch einen Administrator ...

Page 84: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 84

Modularisierung mit OSGi Einführung

Übersicht:

Java Virtual Machine

OSGi-Framework

Service-Registry

Bundle

BundleBundlehängt ab von

verwendet

registriertsich

sucht

Page 85: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 85

Modularisierung mit OSGi Einführung

Logische Schichten in OSGi:

Java Laufzeitumgebung

Modul-Schicht

Dienst-Schicht

Sicherheit

OSGi-Framework

Betriebssystem

Lebenszyklus-verwaltung

OSGi-Dienst

OSGi-Dienst

OSGi-Dienst

Verwaltung der Dienste ineiner „Registry“

Signierung und Rechtevon Bundles

Verwaltung der Zuständeeines Bundles: starten,stoppen, ...

Verwaltung der Bundles alsModule, Auflösung derAbhängigkeiten, ...

Page 86: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 86

Modularisierung mit OSGi Einführung

Modul-Schicht: Ein Bundle (Modul) ist eine Jar-Datei mit einer

darin enthaltenen Manifest-Datei. Die Manifest-Datei beschreibt das Modul:

- Versionsnummer- eindeutiger symbolischer Modulname- beschreibender Modulname- Angebote: exportierte Pakete- Nachfragen: Abhängigkeiten von

anderen Modulen- ...

Page 87: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 87

Modularisierung mit OSGi Einführung

Eclipse bietet zur Manipulation der Manifest-Datei einen Editor:

Page 88: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 88

Modularisierung mit OSGi Lebenszyklus

Lebenszyklus-Verwaltung: Bundles lassen sich dynamisch starten und beenden.

UNINSTALLED

RESOLVED

INSTALLED

install

resolve

uninstall

update/refresh

update/refresh

uninstallSTARTING

start

ACTIVE

STOPPING

stop

Page 89: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 89

Modularisierung mit OSGi Verbindung von Modulen

Wie lassen sich jetzt die Dienste der Bundles verknüpfen?1. Jedes Bundle, das einen Dienst anbietet, registriert sich selbst in der zentralen Registry

mit den folgenden Daten:- Schnittstelle, die der Dienst implementiert- Objekt, das den Dienst anbietet- Optional: Dictionary mit zusätzlichen Name/Wert-Paaren

Modul

Schnittstelle

K1

K2

K3

I1 I2

Modul

Schnittstelle

K4

K5

K6

I4

1. I2 und K2-Objektregistrieren

Service-Registry

2. Referenz auf K2als I2 auslesen

Page 90: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 90

Modularisierung mit OSGi Verbindung von Modulen

2. Deklarativ durch „Dependency Injection“ als „Declarative Services“:- Angebotene Dienste eines Bundles werden in XML-Dateien beschrieben.- Jedes Bundle, das einen Dienst benötigt, beschreibt das auch in seiner XML-Datei.- Die Beziehungen werden automatisch „injiziert“.- ähnliche Idee wie bei Spring soll hier nicht betrachtet werden

Modul

Schnittstelle

K1

K2

K3

I1 I2

Modul

Schnittstelle

K4

K5

K6

I4

1. AngebotenenDienst

beschreiben

2. Benötigten Dienstbeschreiben

XML-Datei XML-Datei

Page 91: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 91

Modularisierung mit OSGi Verbindung von Modulen

3. Deklarativ mit „Dependency Injection“ durch Gemini Blueprint (ehemals Spring Dynamic Modules) soll hier nicht betrachtet werden.

4. Deklarativ mit „Dependency Injection“ durch Google Guice (http://code.google.com/p/google-guice/) und Peaberry (http://code.google.com/p/peaberry/) soll hier ebenfalls nicht betrachtet werden.

5. Weitere Frameworks für „Dependency Injection“

Page 92: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 92

Modularisierung mit OSGi Verbindung von Modulen durch eine Registry

Beispiel mit zwei Bundles (das Börsenkurs-Beispiel ist zu komplex): Das Bundle de.hska.iwii.RandomNumberPlugin stellt einen Dienst zur

Verfügung, der eine ganzzahlige Zufallszahl in einem Bereich zwischen zwei Grenzen liefert.

Das Bundle de.hska.iwii.RandomNumberUser nutzt das erste Bundle und gibt die Zufallszahl aus.

Page 93: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 93

Modularisierung mit OSGi Verbindung von Modulen durch eine Registry

Klassen in RandomNumberPlugin: IRandom: Angebot = Schnittstelle des Dienstes, wird exportiert

public interface IRandom { int getNumber(int from, int to);}

Random: Implementierung des Dienstes, nach außen nicht sichtbarpublic class Random implements IRandom { public int getNumber(int from, int to) { return from + (int) ((to - from + 0.5) * Math.random()); }}

Page 94: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 94

Modularisierung mit OSGi Verbindung von Modulen durch eine Registry

Activator: Wird aufgerufen, wenn das Bundle gestartet oder beendet wird (in der Manifest-Datei konfiguriert), registriert den einzigen Dienst.

Page 95: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 95

Modularisierung mit OSGi Verbindung von Modulen durch eine Registry

public class Activator implements BundleActivator { private ServiceRegistration registration;

public void start(BundleContext context) throws Exception { registration = context.registerService(IRandom.class.getName(), new Random(), null); }

public void stop(BundleContext context) throws Exception { registration.unregister(); }}

Page 96: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 96

Modularisierung mit OSGi Verbindung von Modulen durch eine Registry

Export eines Paketes des Bundles, um es außerhalb nutzen zu können:

Page 97: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 97

Modularisierung mit OSGi Verbindung von Modulen durch eine Registry

In RandomNumberUser: Activator: Wird aufgerufen, wenn das Bundle gestartet oder beendet wird. Beim

Start wird das Bundle RandomNumberPlugin verwendet.public class Activator implements BundleActivator {

public void start(BundleContext context) throws Exception { System.out.println("RandomServiceUser started"); // Indirektion über ServiceReference, um auch die beim // Registrieren übergebenen Properties auslesen zu können. ServiceReference<?> ref = context.getServiceReference(IRandom.class.getName()); // ref kann null sein --> Test hier ausgelassen IRandom rand = (IRandom) context.getService(ref); System.out.println(rand.getNumber(10, 20)); }

public void stop(BundleContext context) throws Exception { }}

Page 98: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 98

Modularisierung mit OSGi Verbindung von Modulen durch eine Registry

Abhängigkeit von einem anderen Paket konfigurieren:

Page 99: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 99

Modularisierung mit OSGi Verbindung von Modulen durch eine Registry

Bzw. in der Manifest-Datei:

Page 100: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 100

Modularisierung mit OSGi Verbindung von Modulen durch eine Registry

Dieses Beispiel hat Nachteile: Das RandomNumberPlugin lässt sich zur Laufzeit nicht austauschen (kein Update). Bei komplexeren Bundles kann es vorkommen, dass diese nicht immer erreichbar sind

(z.B. bei Updates im laufenden Betrieb) Das verwendete Bundle kann nicht deaktiviert werden.

Lösung: Es gibt sogenannte „Service-Tracker“, die den Zustand von Diensten beobachten können:

Sie werden bei Aktivierungen und Deaktivierungen von Diensten benachrichtigt. Sie erlauben die Angabe von Filtern, die die Benachrichtigungskriterien steuern (soll hier

nicht betrachtet werden). So kann ein Modul darauf reagieren, dass ein verwendetes Modul aktiv oder passiv ist.

Page 101: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 101

Modularisierung mit OSGi Verbindung von Modulen durch eine Registry

Wie sieht es mit den Modulabhängigkeiten aus? Direkt über die Registry: Der Abhängigkeitsgraph der Module bestimmt deren

Startreihenfolge extrem aufwändig bei großen Projekten. Beobachter an der Registry: mühsame Beobachtung der Bundle- oder Dienstzustände Mittels „Dependency Injection“: Der Abhängigkeitsgraph wird automatisch von OSGi

verwaltet.

Am besten: Projekt „Gemini Blueprint“ (Kombination aus Spring und OSGi), http://www.eclipse.org/gemini/blueprint/

Page 102: Prof. Dr.-Ing. Holger Vogelsang holger.vogelsang@hs-karlsruhe.de Informatik 2 Objektorientierter Entwurf.

Holger Vogelsang Informatik 2 - Objektorientierter Entwurf 102

Ende