5. JavaBeans - Komponentenbasierte Softwareentwicklung
In diesem Teil der Arbeit soll zunächst eine Einführung in die
komponentenbasierte Softwareentwicklung gegeben werden. Weiterhin wird
eine kleine Einführung in JavaBeans gegeben und es erfolgt ein Vergleich
zwischen JavaBeans und anderen Komponentenmodellen.
5.1 Motivation zur komponentenbasierten Softwareentwicklung
Softwaresysteme und -projekte werden zum einen immer umfangreicher und
komplexer, zum anderen ist es für Softwarehersteller aus betriebswirtschaftlichen
Aspekten sehr wichtig schnell mit leistungsfähigen Produkten am Markt
zu sein, da sonst andere Hersteller als erste "den Fuß in der Tür"
haben. Dies erfordert einen schnellen Entwicklungsprozeß für
neue Softwareprodukte und eine effiziente Nutzung von bereits vorhandenem
Know-How. Die Herstellung neuer und die Verwendung bereits vorhandener
Softwarekomponenten (Softwarebausteine) soll kurze Entwicklungszyklen und
eine effiziente Projektorganisation ermöglichen. Wesentliche Punkte
die zur Verwendung von Softwarekomponenten motivieren sollen sind somit:
-
Reduzierung der Komplexität bei der Softwareentwicklung (große
Projekte können in Teilprobleme aufgeteilt werden)
-
Schnellere Entwicklung (Termineinhaltung; schnell am Markt sein; "Time
to Market"-Problem)
-
Wiederverwendung von vorhandenem Code (auf bereits vorhandenes Know-How
zurückgreifen; Verringerung der Fehlerträchtigkeit)
-
Unabhängigkeit von Hardware und Betriebssystem
-
Erweiterung bereits bestehender Softwaresysteme durch neue Komponenten
Als Lösungsansatz bietet sich die Verwendung objektorientierter Programmiersprachen
an (wiederverwendbare Klassenbibliotheken). Jedoch ist hierbei auf die
durchaus unterschiedliche Objektphilosophie zu achten. So unterstützen
manche Sprachen Mehrfachvererbung (z.B. C++), andere nur Einfachvererbung
(z.B. Java).
5.2 Einführung in die lokale Komponentenarchitektur
Wahrscheinlich hat fast jeder, der diese Arbeit liest schon einmal mit
komponentenbasierter Software gearbeitet (z.B. Office-Anwendungen). Hierbei
handelt es sich meist um (rechner-)lokale Komponenten, in denen die Componentware
ihren Ursprung hat. Auch JavaBeans ist eine lokale Komponentenarchitektur.
Daher soll in diesem Abschnitt zunächst erklärt werden, wie lokale
komponentenbasierte Applikationen aufgebaut sind und arbeiten.
5.2.1 Das Objektmodell
Ein Objektmodell legt die grundsätzliche Architektur für die
Softwarekomponenten fest und muß im wesentlichen folgende Anforderungen
erfüllen:
-
Trennung von Schnittstellendefinition und Klassenimplementierung: Dadurch
wird der Zustand von Objekten gekapselt und läßt sich nur über
Elementfunktionen ändern. Für den Entwickler wird hierdurch eine
höhere Transparenz erzeugt.
-
Versionierungsmechanismus (Anpassbarkeit von Objekten): Neuere Versionen
von Objekten müssen alte ablösen können, d.h. sie müssen
aber auch die alte Funktionen nach wie vor bereitstellen.
-
Wiederverwendbarkeit bestehender Klassen: Dies soll durch Vererbung oder
durch einen Mechanismus zur Einbettung oder Erweiterung vorhandener Klassen
erfolgen.
-
Binäre Klassenbibliotheken müssen sich dynamisch (zur Laufzeit
des Programms) einbinden lassen.
5.2.2 Aufbau einer lokalen komponentenbasierten
Anwendung
Eine komponentenbasierte Applikation ist im wesentlichen aus drei zu unterscheidenden
Bestandteilen aufgebaut: Container-Anwendung, Softwarekomponenten und Componentware-Infrastruktur.
Die Containeranwendung besteht aus einem Anwendungsgerüst und aus
mehreren binären Softwarekomponenten, denen spezielle Aufgabe zukommen.
Bei diesen Komponenten handelt es sich um Softwarebausteine, die als solche
in mehrere Anwendungen eingebunden werden können. Eine Komponente
könnte ein z.B. Listenfeld sein, das in einer Anwendung eingesetzt
wird. Aber auch eine komplexe Tabellenkalkulation kann einen Baustein einer
noch komplexeren Anwendung darstellen. Zur Regelung der Kommunikation zwischen
den einzelnen Komponenten wird eine Componentware-Infrastruktur benötigt.
Hier verwendet man meist ORB-basierte Ansätze (ORB = Objekt Request
Broker). Ein ORB ist ein Softwarebus, der die Kommunikation zwischen Objekten
regelt.
Man darf diese Aufteilung jedoch nicht als starre Funktionszuordnung
betrachten, die eine Komponente erhält, sondere eher als wechselnde
Rolle, die ein Softwarebaustein einnehmen kann. So ist es durchaus möglich
bzw. beabsichtigt, daß eine Komponente im einen Fall als Container
eingesetzt wird und in einem anderen Fall nur als Komponente.
5.2.3 Anforderungen an das Komponentenmodell
Das Komponentenmodell legt wie ein Objektmodell spezielle Anforderungen
für Komponenten fest und muß vor allem die Anforderungen, die
an ein Objektmodell gestellt werden erfüllen. Es legt aber darüber
hinaus Verhaltensweisen für Softwarebausteine fest, die sichergestellt
sein müssen, damit diese in einer Anwendung (bzw. in mehreren) verwendet
werden können. Daher sind folgende Anforderungen unbedingt zu erfüllen:
-
Das Komponentenmodell muß festlegen, wie auf eine Komponente und
ihre Funktionalität zugegriffen werden kann. Dies erfolgt über
spezielle Ein- und Ausgangsschnittstellen. Die Eingangsschnittstelle stellt
Methoden bereit, mit denen der Zustand eines Objekts (seine Attribute)
verändert werden kann und mit denen das Objekt zur Ausführung
spezieller Funktionen veranlaßt wird. Über die Augangsschnittstelle
kommuniziert das Objekt mit anderen Komponenten und gibt Werte zurück.
-
Damit der Zustand einer Komponente persistent gemacht werden kann, wird
ein Mechanismus zur Speicherung benötigt.
-
Um sich an das Bildschirmlayout einer Anwendung anpassen zu können,
ist ein Mechanismus erforderlich mit Hilfe dessen sich Komponenten innerhalb
eines Containers an dessen Layout automatisch anpassen können.
-
Komponenten benötigen "Stellschrauben" in Form von Attributen, mit
denen der Softwareentwickler Anpassungen vornehmen kann.
-
Das Komponentenmodell muß von Softwareentwicklungsumgebungen unterstützt
werden. Dadurch soll es möglich werden die Attribute und Methoden
innerhalb einer Programmierumgebung abrufbar zu machen bzw. diese zu visualisieren
(z.B. mit Hilfe eines Class-Viewers).
-
Durch dynamisches Binden sollen Komponenten zur Laufzeit in den Adreßraum
eines Containers eingebunden werden können. Dies hat vor allem sehr
positive Auswirkungen auf die Performanz einer Anwendung.
Durch diese Spezifikationen soll zum einen der Entwicklungsprozeß
vereinfacht werden (insbesondere bei der Verwendung von Fremdkomponenten)
und zum anderen soll die Funktionsfähigkeit zur Laufzeit sichergestellt
werden.
5.2.4 Verteilte Komponentenarchitektur
Prinzipiell ist diese verteilte Komponentenarchitektur mit der lokalen
vergleichbar. Ein wesentlicher Unterschied ist, daß hier netzwerkweite
Softwarekomponenten verwendet werden. Dies hat zur Folge, daß zusätzlich
bzw. ergänzend zur Componentware-Infrastruktur eine Verteilungsplattform
benötigt wird, welche die Kommunikation zwischen Softwarekomponenten
über Rechnergrenzen hinweg ermöglicht.
Die Verwendung entfernter Objekte oder Komponenten macht es erforderlich,
daß man Zugriff auf den Adreßraum eines entfernten Rechners
hat. Zu diesem Zweck erhält eine lokale Komponente eine Referenz auf
ein entferntes Objekt auf einem anderen Rechner. Da es nicht ohne weiteres
möglich ist auf den Adreßraum eines anderen Rechners zuzugreifen,
arbeitet man mit einer Kopie des Adreßraum an einer bestimmten Adresse.
Mit Hilfe von sogenannten Factory-Objekten kann man auch Objekte auf fremden
Rechnern erzeugen.
Derzeit sind solche verteilten Komponentenarchitekturen ein sehr aktuelles
Thema. CORBA hat sich in diesem Bereich schon sehr behauptet, steht jedoch
anderen Komponentenarchitekturen gegenüber. In Abschnitt
5.4 wird nochmals darauf eingegangen.
5.3 JavaBeans - Das Komponentenmodell für Java
In diesem Anschnitt soll JavaBeans vorgestellt werden. Es ist aufgrund
des begrenzten Umfangs dieser Arbeit jedoch nicht möglicht JavaBeans
in allen Einzelheiten vorzustellen. Vielmehr soll hier das Konzept von
JavaBeans erläutert und von anderen Komponentenmodellen abgegrenzt
werden. Für einen tieferen Einblick in JavaBeans sind folgende Quellen
sehr hilfreich:
http://www.javasoft.com/beans/
http://www.javasoft.com/beans/docs/spec.html
5.3.1 Das Konzept von JavaBeans
JavaBeans ist eine plattformunabhängige Architektur für Java-Komponenten.
Beans sind (Java-)Komponenten, aus denen sich Java-Applets und Applikationen
modular zusammensetzen lassen. Während bei Java das Objekt die kleinste
Einheit darstellt, so ist es bei JavaBeans eben ein Bean. Diese Komponenten
haben bestimmte Eigenschaften (Attribute) und ein bestimmtes externes Verhalten
(Ereignisse und Methoden).
Beans arbeiten innerhalb eines Containers (z.B. Webbrowser, Bean-Box,
über ActiveX-Bridge auch in ActiveX-Container), können aber auch
selbst die Rolle des Containers einnehmen. Normalerweise sind Beans relativ
komplexe Elemente einer grafischen Oberfläche, wie z.B. eine Kalkulationstabelle
oder ein Kalender-Steuerelement. Entwickler, die Erfahrung mit OLE(OCX)-
und VBX-Komponenten haben, werden erkennen, daß hier erhebliche Ähnlichkeiten
zu JavaBeans bestehen.
Da die Ereignisse und Eigenschaften von JavaBeans die zwei wesentlichen
Bestandteile diese Konzepts sind, sollen diese anschließend genauer
dargestellt werden.
5.3.2 Eigenschaften
Eigenschaften sind Public-Attribute eines Beans und dienen der Beeinflussung
von Verhalten und Erscheinung einer Komponente. Der Zugriff auf die Eigenschaften
erfolgt gemäß dem Prinzip der Datenkapselung über lesende
und schreibende Elementfunktionen. JavaBeans unterscheidet vier Typen von
Eigenschaften: Einfache, indizierte, gebundene und zwingende.
Einfache Eigenschaften
Einfache Eigenschaften repräsentieren einen einzigen Wert Auch
werden hier nur die einfachen Datentypen von Java verwendet. Diese sind
z.B. int, float, Boolean, ...
Beispiel:
public class SimpleBean extends Canvas {
// Einfache Eigenschaft
string Farbe = "Blau";
}
Indizierte Eigenschaften
Indizierte Eigenschaften ermöglichen die Verwendung von Arrays
als Eigenschaft eines Beans. Somit können mehrere Werte in einer Eigenschaft
zusammengefaßt werden. Der Zugriff auf die einzelnen Komponenten
erfolgt über einen Index (Integer). Ein Beispiel für eine solche
Menge sei z.B. eine Menge von Farben, die ein Button haben kann.
Beispiel:
public class SimpleBean extends Canvas {
// Indizierte Eigenschaft
int[] Index = {1,2,3,4,5,6,7,8,9,0};
// Zugriff auf die Eigenschaft
// 1. Das ganze Feld setzen
public void GanzesFeldSetzen(int[] x) {
Index = x;
}
// Auf ein Element zugreifen
public void SetzeWert (int postition, int wert) {
Index[position] = wert;
}
// Ganzes Feld zurückgeben
public int[] GanzesFeld() {
return Index;
}
// Auf ein Element zugreifen
public int GibWert (int postition) {
return Index[position];
}
}
Gebundene Eigenschaften
Gebundene Eigenschaften dienen zur Benachrichtigung über Zustandsänderungen
eines Beans. Sie bieten die Möglichkeit zur Information anderer Objekte,
falls sich der Wert einer Eigenschaft ändert. In diesem Fall wird
ein spezielles Ereignis ausgelöst (siehe 3.3), auf das der Empfänger
dann reagieren kann.
Beispiel:
public class Sender extends Canvas {
string Farbe = "Blau";
// Deklarieren und Instanziieren eines "Property Change"-Objekts
private PropertyChangeSupport Aenderung =
new PropertyCangeSupport(this);
// Ändern der Farbe
public void setzeFarbe(string neueFarbe) {
string alteFarbe = Farbe;
Farbe = neueFarbe;
// Ereignis bei Änderung auslösen
Aenderung.firePropertyChange("string",
alteFarbe, neueFarbe);
}
// ...
}
Zwingende Eigenschaften
Diese Eigenschaften erlauben die Validierung einer durchzuführenden
Änderung durch ein anderes Objekt bzw. eine andere Komponente. Sie
lassen sich auch mit gebundenen Eigenschaften kombinieren, wobei dies nur
sinnvoll ist, wenn man die zwingende Eigenschaft der gebundenen voranstellt.
Im Falle einer fehlgeschlagenen Validierung wird die gebundene Eigenschaft
dann nicht mehr berücksichtigt.
5.3.3 Ereignisse
Damit einzelne JavaBeans miteinander zusammenwirken können, müssen
sie miteinander kommunizieren. Das Ereignismodell stellt einen Mechanismus
bereit, mit dessen Hilfe eines oder mehrere Objekte über Zustandsänderungen
eines Objekts informiert werden.
Ein Ereignis geht immer von einer Ereignisquelle aus und wird an einen
Ereignisempfänger weitergeleitet. Dieser muß dann eine entsprechende
Ereignismethode zur Verfügung stellen. Ereignisquellen haben eine
Liste von Ereignisempfängern. In der Liste müssen sich die Empfänger
registrieren , indem sie eine Referenz auf ihre Ereignisbehandlungsmethode
übergeben. Somit wissen die Quellen, wen sie benachrichtigen sollen.
Neben diesen mehrfachen möglichen Empfängern (Multicast),
ermöglicht es das Ereignismodell auch nur genau einen (bestimmten)
Empfänger zuzulassen (Unicast-Ereignis). Zur Vermeidung von Deadlocks
innerhalb eines Multithreading-Systems stellt JavaBeans einen Synchronisationsmechnismus
bereit.
5.3.4 Enterprise JavaBeans
JavaBeans wurde als lokales Komponentenmodell entworfen. Zur Nutzung von
entfernten Ressourcen wurde erst vor kurzer Zeit das Konzept der Enterprise
JavaBeans entworfen. Folgende Features sollen die Verteilung von JavaBeans
ermöglichen:
-
JDBC-API: Zugriff auf relationale Datenbanken.
-
Remote Method Invocation (RMI): Ein RPC-Mechanismus für Java,
der die Kommunikation über unterschiedliche Adreßräume
hinweg erlaubt. Leider ist jedoch keine programmiersprachenneutrale Schnittstellensprache
vorgesehen. Die Enterprise JavaBeans werden somit zu einer reinen Java-Lösung.
-
Verwendung des Java Remote Method Protocol (JRMP) zur Kommunikation
zwischen den Softwarekomponenten. In Zukunft ist die Verwendung des von
der OMG spezifizierten IIOP geplant.
Aktuelle Informationen zu Enterprise Java Beans: http://www.javasoft.com/products/ejb/
5.4 JavaBeans im Vergleich zu CORBA und ActiveX/DCOM
5.4.1 CORBA und ActiveX
CORBA
CORBA ist ein von der OMG (Object Management Group) definierter Standard
(also keine Implementierung) zur Realisierung verteilter, objektorientierter
Anwendungen. CORBA ist unabhängig von Betriebssystem, Rechnerarchitektur
und Programmiersprachen. Letzeres wird durch die von der OMG spezifizierte
CORBA-IDL (Interface Definition Language) erreicht. Hierbei handelt es
sich um eine ausführliche, standardisierte Beschreibungssprache zur
Definition von allgemeinen Schnittstellen. Mit Hilfe eines IDL-Compilers
werden schließlich die programmiersprachenspezifischen Schnittstellen
erzeugt.
Folgendes Beispiel soll diese Vorgehensweise unter Verwendung der CORBA-Plattform
ILU verdeutlichen:
IDL-Schnittstelle:
module Test {
interface Taschenrechner {
// gibt das Ergebnis zurück
double GibWert ();
};
};
Mit dem IDL-Compiler erzeugte Java-Schnittstelle:
public class Taschenrechner implements stubs.Test.Taschenrechner
{
// ..
public double GibWert() {
return aktuellerWert;
}
//..
}
Entsprechend kann auch eine C++-Schnittstelle erzeugt werden:
class Test_T_Taschenrechner : public virtual iluObject {
public:
Test_T_Taschenrechner(); // constructor
virtual ~Test_T_Taschenrechner(); // destructor
//..
virtual double GibWert (TestStatus *_status);
//..
};
CORBA ermöglicht eine Kommunikation über verschiedenen Adreßräume
hinweg. Ein Softwarebus (ORB) regelt die Verwaltung von Objekten und Methoden
der unterschiedlichen Softwarekomponenten. Der Entwickler muß sich
also nicht mit technischen oder kommunikationsspezifischen Fragestellungen
auseinandersetzen.
ActiveX/DCOM
ActiveX ist die von Microsoft entwickelte
Komponentenarchitektur für das Internet und kann als Nachfolger der
VBX- und OCX-Komponenten angesehen werden. Im Gegensatz zu JavaBeans ist
ActiveX jedoch nicht plattformunabhängig, sondern an Windows gebunden.
ActiveX-Komponenten müssen sich in der Windows-Registrierungs-Datenbank
anmelden.
Das zugehörige Komponetenmodell für ActiveX ist COM (Component
Object Model) bzw. DCOM (Distributed Component Object Model). Beides sind
ORB-basierte Komponentenmodelle. Während COM nur einen Object Request
Broker für einen einzelnen Rechner zur Verfügung stellt, soll
DCOM die netzwerkweite Kommunikation zwischen Softwarekomponeten ermöglichen.
Seit September 1996 ist DCOM Bestandteil von WindowsNT (Version 4.0)
und seit Anfang 1997 ist es auch Bestandteil des Betriebssystems Windows
95. Dadurch hat DCOM natürlich schon weite Verbreitung gefunden. Die
Implementierung von DCOM-Komponenten ist in verschiedenen Programmiersprachen
möglich, auch in relativ "einfachen" und in der Praxis sehr verbreiteten
Sprachen, wie Visual Basic.
Microsoft möchte mit dieser Komponentenarchitektur wieder einen
eigenen Standard durchsetzen, an den sich schließlich alle anderen
wieder mit ihren Konzepten anpassen müssen. So ist DCOM nicht CORBA-konform
und auch JavaBeans muß sich noch gegen ActiveX behaupten. Abschließend
wird nun ein Vergleich zwischen JavaBeans, CORBA und ActiveX vorgenommen.
5.4.2 Die drei Komponentenplattformen im Vergleich
Plattformunabhängigkeit
Im Gegensatz zu JavaBeans und CORBA ist ActiveX an eine Plattform gebunden.
Jedoch ist eine Portierung auf anderen Plattformen geplant. In der Computerwoche
6/98 hat Microsoft COM-Komponenten für Unix angekündigt.
Verbreitung
ActiveX/DCOM hat den Vorteil einer sehr weiten Verbreitung, da es integraler
Bestandteil des Windows-Betriebssystems ist. Auch die Verwendung von stark
verbreiteten Programmiersprachen, wie Visual Basic ist ein Vorteil.
Die Verbreitung von CORBA ist durch die zahlreichen namhaften Mitglieder
der OMG (z.B. SUN, 3COM, Hewlett-Packard, Canon, ...) auch schon weit fortgeschritten.
JavaBeans ist in der Verbreitung leider noch etwas zurück, was wohl
auch darauf zurückzuführen ist, daß es das neuste der drei
Konzepte ist.
Programmiersprachen
JavaBeans und auch Enterprise Java Beans sind Java-spezifisch, können
jedoch über Bridges in andere Systeme integriert werden. CORBA hat
den Vorteil völlig sprachunabhängig zu sein, stellt jedoch teilweise
recht hohe Ansprüche an den Entwickler. ActiveX ist vor allem auch
für "einfache" Programmiersprachen verfügbar.
Sicherheit
JavaBeans wurde unter Sicherheitsaspekten entwickelt. Die Beans laufen
auf der "Java Virtual Machine" und haben keinen Zgriff auf Dateien und
Anwendungen. CORBA kann ebenfalls als sicher angesehen, insbesondere kann
hier auch der Entwickler selbst für Sicherheit sorgen. Im Gegensatz
dazu kann man ActiveX erhebliche Sicherheitsprobleme vorwerfen, da die
ActiveX-Controls Zugriff auf das Betriebssystem, seine Dateien und Anwendungen
haben.
Geschwindigkeit
Ein großes Problem von Java Beans ist die Geschwindigkeit: Der plattformunabhängige
Code muß von der Virtual Machine interpretiert werden. ActiveX ist
schnell, da es speziell für Windows optimiert ist, was jedoch aufgrund
der Plattformabhängigkeit nicht nur als Vorteil angesehen werden kann.
CORBA hat keine Geschwindigkeitprobleme, da der Entwickler eigentlich selbst
für die Performanz seiner Applikationen verantwortlich ist und diese
der jeweiligen Plattform angepaßt werden kann.
[Zurück]
[Inhalt]
[Weiter]