Leichtgewichtiger Container

Ganz allgemein betrachtet realisieren Container als eine spezielle Form von Frameworks Laufzeitumgebungen, in denen Objekte verwaltet werden. Zudem werden diesen Objekten Basisdienste zur Verfügung gestellt. Ein zentrales Merkmal leichtgewichtiger Container ist die Anwendung der Methodik der Dependency Injection - einer speziellen Ausprägung des Inversion of Control-Prinzips. Dabei werden die Beziehungen zwischen Komponenten erst zur Laufzeit hergestellt, so dass es dadurch möglich ist, verschiedene Implementierungen einer Komponente zur Verfügung zu stellen.

Inversion of Control ( IoC) ist eines der wichtigsten Konzepte von Frameworks zur Entwicklung von wart- sowie testbarem Code, der zudem noch gering gekoppelt ist. Leichtgewichtige Container unterstützen bei der Konfiguration von Anwendungen. Anstatt durch verschiedene Konfigurationsdateien können dynamisch zur Laufzeit alle Konfigurationen zentral an einer Stelle durchgeführt werden. Ein bekanntes Beispiel für einen leichtgewichtigen Container ist das Framework Spring, bei dem die fachlichen Klassen als sogenannte POJOs - das ist ein Akronym für einfache Java-Klassen - umgesetzt werden. Weitere Beispiele für leichtgewichtige Container sind die als Open Source verfügbaren Frameworks Avalon, Keel, Pico oder HiveMind. Diese bieten allesamt Funktionalitäten an, die alternativ zu Enterprise JavaBeans (EJBs) eingesetzt werden können.

Der Begriff des Containers im Zusammenhang mit leichtgewichtigen Containern bezeichnet häufig ein Meta-Framework. Dieses stellt neben generischen Mechanismen zum Auffinden und Laden eines Objektes anhand eines symbolischen Namens, auch die Verwaltung der Lebenszyklen von Objekten zur Verfügung. Durch die Einbeziehung weiterer Frameworks - deshalb spricht man bei einem leichtgewichtigen Container auch von einem Meta-Framework - können zusätzliche Services wie beispielsweise Persistenz- Dienste bereitgestellt werden. Lightweight Container können somit zwar eine ähnliche Funktionalität wie Applikationsserver anbieten - Zielsetzung ist es jedoch, die Bindung an Applikationsserver selbst aufzuheben.

Charakteristiken von Lightweight Containern

Lightweight Container (LWC) können hinsichtlich ihrer Eigenschaften wie folgt charakterisiert werden:

  • Ein LWC soll den Code einer Applikation bzw. deren Objekte verwalten, jedoch keinerlei zusätzliche Abhängigkeiten schaffen. So soll es beispielsweise möglich sein, Legacy-Code ohne weitere Anpassungen ausführen zu können.
  • Ein LWC kann sehr schnell gestartet werden.
  • Um Objekte in den LWC zu stellen, muss kein aufwendiger Deployment- Prozess gestartet werden.
  • Ein LWC soll grundlegend nur minimale Ressourcen benötigen und minimale Abhängigkeit von Schnittstellen haben. Damit ist dann der Code in einer Vielzahl von Umgebungen wie J2SE, J2ME oder J2EE lauffähig
  • Ein LWC soll den Aufwand für das Deployment von verwalteten Objekten grundsätzlich so gering halten, dass er für Objekte unabhängig von ihrer Granularität eingesetzt werden kann. Mit Granularität wird der Grad der Aggregation festgelegt.

Daraus ergeben sich zwangsläufig die Gründe, warum beispielsweise EJB-Container nicht den leichtgewichtigen Containern zugeordnet werden:

  • Ein für das EJB-Modell geschriebener Code läuft grundsätzlich nicht außerhalb des EJB-Containers. Somit ist der Code immer vom Container abhängig.
  • EJB-Container sind relativ langsam beim Auf-starten.
Verschiedene Arten von IoC

Verschiedene Arten von IoC

Ein zentraler Aspekt bei der Entscheidung für einen Lightweight Container ist die Forderung nach möglichst großer Unabhängigkeit des Applikationscodes vom Container. Hier sei an die große Abhängigkeit des Codes vor Einführung der EJB 3.0 erinnert. Da Objekte jedoch nicht isoliert voneinander arbeiten können, sind entsprechende Mechanismen zur Interobjekt- Kommunikation erforderlich. Ohne dass zusätzliche Abhängigkeiten vom Container erzeugt werden, wird häufig zur Interobjekt-Assoziation das Prinzip von der Umkehr des Kontrollflusses - Inversion of Control (IoC) - und dort als dessen spezielle Ausprägung das Dependency Injection angewendet.

Für die Erklärung des Prinzips im Detail wird auf den entsprechenden Hauptartikel verwiesen; in diesem Zusammenhang verdeutlicht die Abbildung die verschiedenen Arten von Inversion of Control.

Für die Verwendung eines Lightweight Containers sprechen die nachfolgenden Vorteile:

  • Es ist kein monolithischer Container.
  • Die Wiederverwendbarkeit des Codes ist gegeben.
  • Bessere Objektorientierung.
  • Größere Produktivität aufgrund dessen sich Code einfacher in jeder Entwicklungsumgebung schreiben lässt.
  • Bessere Testbarkeit der Komponenten.

Folgende Lightweight Container-Implementierungen sind bekannt und als Open Source verfügbar:

Avalon Framework War 1999 einer der ersten Container nach dem Inversion of Control-Prinzip. Wird auch als invasives Framework bezeichnet, weil der Code angepasst werden muss, damit die Avalon-spezifischen Interfaces berücksichtigt werden. Das Avalon-Framework wurde unter dem Namen Excalibur weiter entwickelt.

Spring Framework Ist eine umfassende Implementierung eines Lightweight Containers. Bietet u.a. auch die Einbeziehung eines Frameworks für aspektorientierte Programmierung. Weiterhin werden die Integration von verschiedensten Persistenz-Technologien, ein transparentes Transaktions-Management und einiges mehr geboten.

Keel Framework Ist ein Meta-Framework und integriert die Funktionalität von mehreren Frameworks. Dabei werden ähnliche Ziele wie von Spring verfolgt, ohne dass sich Keel ebenso am Markt durchsetzen konnte.

Pico Container Realisiert einen Container, der jedoch keine weiteren Features wie Spring bietet. Ebenso können keine Frameworks von externer Seite integriert werden.

HiveMind Ist ebenfalls ein IoC-Container. Auch hier ist die Integration aspektorientierter Programmierung möglich. Hat ebenfalls nicht den mächtigen Funktionsumfang wie das Spring Framework.

Informationen zum Artikel
Deutsch: Leichtgewichtiger Container
Englisch: lightweight container - LWC
Veröffentlicht: 28.10.2013
Wörter: 809
Tags: Programmiersprachen
Links: Container, Framework, Laufzeitumgebung, Objekt, Dependency Injection
Übersetzung: EN
Sharing: