Spring – das Framework für komplexe Java-Applikationen
2002 stellte der australische Entwickler Rod Johnson in seinem Werk „Expert One-on-One J2EE Design and Development“ den Code des Java-Frameworks Interface21 vor, den er speziell für die Verwendung in seinen eigenen Projekten geschrieben hatte. Auf Basis dieses Codes entwickelte er später gemeinsam mit anderen Programmierern das Spring-Framework, das im Juni 2003 erstmals unter der freien Lizenz Apache 2.0 auf SourceForge veröffentlicht wurde und bis heute zu den beliebtesten Lösungen für die Entwicklung von Enterprise-Anwendungen in Java zählt. Das Open-Source-Framework räumt seitdem mit den Schwächen und Limitierungen der standardmäßigen Entwicklungsumgebung J2EE (heute auch als „Java Plattform“ bekannt) und des Komponentenmodells Enterprise JavaBeans (EJB) auf, indem es deren Komplexität erheblich reduziert.
Was ist Spring?
Spring vereinfacht die Entwicklung von Java-Applikationen – wobei es keinerlei Rolle spielt, ob es sich dabei um gewöhnliche Offline- oder um Webanwendungen handelt. Die größten Vorteile des Frameworks sind dabei sein schlanker Quellcode und der geringe Aufwand für Anpassungen. Um dem Programmierer diesen Komfort bieten zu können, basiert es auf folgenden Grundsätzen, die Rod Johnson bereits seinem Buch erläutert hat:
- Dependency Injection (DI): Als Dependency Injection bezeichnet man in der objektorientierten Programmierung eine externe Instanz, die die Abhängigkeiten von Objekten im Vorhinein regelt. Spring bedient sich zu diesem Zweck der Java-Komponenten JavaBeans. Diese fungieren in Java unter anderem als Container zur Datenübertragung, weshalb sie im Spring-Framework als Vorlage für alle verwalteten Ressourcen („beans“) dienen. Auf diese Weise kann Spring als Container agieren, der dem jeweiligen Java-Projekt vorkonfigurierte Klassen inklusive ihrer Abhängigkeiten zur Verfügung stellt.
- Aspektorientierte Programmierung (AOP): Um die Modularität objektorientierter Applikationen zusätzlich zu erhöhen, bietet Spring optional auch einen aspektorientierten Programmierungsansatz mit der Sprache AspectJ. Somit lassen sich Aspekte, also komponentenübergreifende Zusammenhänge, die in komplexen Systemen unvermeidbar sind, syntaktisch strukturieren. Das hat den Vorteil, dass der eigentliche Programmcode von technischen Abläufen wie Fehlerbehandlung, Validierung oder Sicherheit getrennt wird.
- Templates: Als Templates werden in Spring Klassen für verschiedene Programmschnittstellen bezeichnet, die die Arbeit mit APIs vereinfachen, indem sie automatisches Ressourcenmanagement, einheitliche Fehlerbehandlungen und andere Hilfestellungen bieten.
Dadurch, dass die oben genannten Grundsätze befolgt werden, erlaubt es das Spring-Framework, bei der Entwicklung von Enterprise-Java-Anwendungen auf Plain Old Java Objects (frei übersetzt: ganz gewöhnliche Java Objekte), kurz POJOs, zurückzugreifen. Diese sind anders als ihr Gegenentwurf Enterprise JavaBeans (EJBs) in nahezu jeder Umgebung lauffähig und benötigen daher auch keinen spezifischen Applikationsserver, der die EJB-Container unterstützt – Standardlösungen wie Tomcat sind vollkommen ausreichend. Um Spring nutzen zu können, benötigen Sie zudem das Java SE Development Kit (SDK).
Spring: Einführung in die wichtigsten Module
Für die verschiedensten Applikationen in Java ist Spring die perfekte Wahl, was in erster Linie auf den modularen Aufbau des Frameworks zurückzuführen ist. Rund 20 Module stehen Ihnen bei der Entwicklung mit Spring zur Verfügung, wobei Sie frei wählen können, welche dieser Komponenten Sie für Ihre Applikation nutzen und welche nicht. In der Standardarchitektur sind die unterschiedlichen Module in folgende sechs Oberkategorien eingeteilt:
- Core Container: Der Core Container enthält die elementaren Module spring-core, spring-beans, spring-context, spring-context-support und spring-expression. Core und Beans bilden dabei das Grundgerüst des Frameworks und enthalten beispielsweise die Dependency-Injection-Funktion sowie den POJO-Support. Das Context-Modul erbt seine Features vom Beans-Modul und fügt der Applikation zum Beispiel Funktionen zur Internationalisierung oder zum Laden von Ressourcen hinzu. Zusätzlich unterstützt es Java-Enterprise-Features wie EJB und JMX (Java Management Extensions). Mithilfe von Context-Support können Bibliotheken von Drittanbietern in Spring eingebunden werden. spring-expression enthält die Spring Expression Language (SPeL), eine Erweiterung der Unified Expression Language der JSP-2.1-Spezifikation (JavaServer Pages).
- AOP und Instrumentation: Um die aspektorientierte Programmierung zu ermöglichen, enthält das Spring-Framework das Modul spring-aop sowie das Modul spring-aspects zur Integration der bereits erwähnten Sprache AspectJ. Die spring-instrument-Komponente erlaubt es, Java-Klassen zu instrumentalisieren – also Bytecode zur Laufzeit zu verändern – und fügt außerdem ClassLoader-Implementierungen für verschiedene Applikationsserver hinzu.
- Messaging: Um als Basis für nachrichtenbasierte Anwendungen fungieren zu können, verfügt Spring über einige Schlüsselfunktionen des Spring-Integration-Projekts – wie zum Beispiel „Message“, „MessageChannel“ oder „MessageHandler“. Das entsprechende Modul trägt den Namen spring-messaging.
- Data Access/Integration: Die Module dieser Kategorie dienen dazu, Java-Applikationen die notwendigen Fähigkeiten zur Interaktion mit anderen Anwendungen zu verleihen und den Datenzugriff zu regeln. Das Modul spring-jdbc stellt beispielsweise eine Abstraktionsschicht zur Verfügung, die definiert, wie ein Client auf die Datenbank zugreift, und das umständliche JDBC-typische Codieren erübrigt. spring-orm wartet hingegen mit Integrationsschichten für populäre ORM-Schnittstellen auf, mit denen man auf relationale Datenbanken zugreifen kann. Die weiteren Komponenten sind spring-tx (unterstützt programmatisches Transaktionsmanagement für alle Klassen und POJOs), spring-oxm (Abstraktionsschicht für Object-/XML-Mapping) und spring-jms, ein Modul mit Features zum Produzieren und Verarbeiten von Nachrichten.
- Web: In dieser Kategorie finden sich die spezifischen Module für Webanwendungen spring-web, spring-webmvc und spring-websocket. Ersteres fügt der Java-Applikation die typischen weborientierten Integrations-Features wie eine Upload-Funktion für mehrteilige Daten (multipart) oder einen HTTP-Client hinzu. Das Modul spring-webmvc wird auch als Web-Servlet bezeichnet und erhält die Spring-Implementationen zur Realisierung der standardmäßigen Model-View-Controller-Architektur und der REST-Webservices. spring-websocket ermöglicht Datenübertragung zwischen Client und Server auf Grundlage von WebSockets.
- Test: Das spring-test-Modul ermöglicht es, die Funktionalität der Komponenten Ihrer Java-Anwendung zu überprüfen. So können Sie diese mit entsprechenden Zusatz-Frameworks wie JUnit oder TestNG umfangreichen Unit-Tests (mit Fokus auf einer einzelnen Komponente) sowie Integrations-Tests (mit Fokus auf das Zusammenspiel mehrerer Komponenten) unterziehen.
Spring: Java in der modernen Webentwicklung
Von Beginn an war Java inklusive der damit zusammenhängenden Technologien für den Einsatz in der Webentwicklung geplant. Nach Startschwierigkeiten aufgrund der geringen Unterstützung früherer Browser, der noch geringen Bandbreite privater Internetanschlüsse und unzureichender Rechenleistung damaliger PCs erlebte die Programmiersprache Ende der 90er-Jahre ihren Durchbruch. In den Anfängen des World Wide Webs waren Java-Applets noch beliebt – das sind in Java geschriebene Anwendungen, die mithilfe entsprechender Laufzeitumgebungen im Browser ausgeführt werden und mit dem Benutzer interagieren können, ohne Daten zum Server senden zu müssen. Aufgrund ihrer Ressourcenlastigkeit waren sie aber nicht sehr praxistauglich. Mit dem Aufstieg mobiler Geräte, deren Browser Applets nicht unterstützen, sind die interaktiven Webelemente komplett von der Bildfläche verschwunden.
Während sich Java im Frontend also relativ schnell als Flop erwiesen hat, ist die Programmiersprache serverseitig zu einer festen Größe geworden, wobei die Anwendungsszenarios ganz unterschiedlich sind: Von Servlets, den auf Servern ausgeführten Applet-Pendants, bis hin zu komplexen Enterprise-Lösungen wie Middleware, Banken-Software oder großen Content-Management-Systemen sind verschiedenste Java-Technologien heute gefragter denn je, insofern es das Budget zulässt. Aufgrund seiner Vorzüge in punkto Kosten und Zeitaufwand wird nämlich bei rund drei Viertel aller Websites die Skriptsprache PHP eingesetzt. Für Webentwickler, die dennoch mit Java arbeiten, bietet Spring jedoch sowohl die notwendigen Strukturen als auch eine erhebliche Vereinfachung des Arbeitsprozesses. Die Vorzüge von Java-Webanwendungen sind unter anderem ihre Plattformunabhängigkeit und Integrationsfähigkeit zu Unternehmens-Software und -Prozessen, sowie ihre klare Struktur.
Für welche Projekte eignet sich das Spring-Framework am besten?
Spring wird typischerweise auch als Lightweight-Framework (dt. leichtgewichtig) für Java-Anwendungen bezeichnet, da nahezu keinerlei Anpassungen am Quellcode notwendig sind, um von seinen vielzähligen Vorteilen zu profitieren. Unter anderem handelt es sich dabei um Vereinfachungen bei der Umsetzung von Transaktions-Management, Schnittstellen und dem Datenbankzugriff. Auch die Möglichkeit, unkompliziert Unit- und Integrations-Tests durchzuführen, ist ein entscheidender Grund für die Beliebtheit des Spring-Frameworks. Der zentrale Punkt ist jedoch ohne Zweifel der Verzicht auf plattformspezifische und nicht-standardisierte Komponenten, der Spring in hohem Maße portabel und unabhängig von Applikationsservern macht. Aus diesem Grund kann man es problemlos als Meta-Framework einsetzen, in das sich weitere externe Komponenten oder gar Frameworks integrieren lassen. Ein typisches Anwendungsbeispiel ist die Entwicklung eines Backends auf Spring-Basis, das man anschließend mit einem Frontend verknüpft, das zuvor mithilfe eines UI-Frameworks wie Twitter Bootstrap erstellt wurde.
Insbesondere bei der Realisierung komplexer Business-Anwendungen spielt Spring seine Stärken aus. Für Unternehmen ist das Framework sowie Java im Allgemeinen deshalb seit Jahren eine ausgezeichnete Wahl, um die benötigten Technologien umzusetzen. Anders als reine Webframeworks – wie beispielsweise das Konkurrenzprojekt Struts von Apache – ist Spring dabei nicht auf Webapplikationen beschränkt, sondern ermöglicht auch die Entwicklung nativer Desktop-Lösungen. Für einfache Anwendungen – ob online oder offline – sind Spring (und Java) jedoch eher weniger geeignet, auch wenn die Realisierung solcher Projekte grundsätzlich möglich ist.
Die Vorteile von Spring im Überblick
Wenn Sie vor der Entwicklung Ihres nächsten großen Projekts stehen und auf der Suche nach dem passenden Framework sind, sollten Sie den Einsatz des Spring-Frameworks in Betracht ziehen. Insbesondere, wenn Java in Ihren Plänen sowieso eine Rolle spielt, können Sie sich die Arbeit erheblich vereinfachen, indem Sie die flexible Modulsammlung nutzen. So erhalten Sie eine leistungsstarke Grundstruktur, die Sie kaum verändern müssen, und können sich ganz auf die Entwicklung der eigentlichen Business-Logik konzentrieren. Im offiziellen GitHub-Repository können Sie das Framework jederzeit herunterladen und ausprobieren. Hier für Sie Vorzüge der Java-Entwicklungsumgebung noch einmal für Sie übersichtlich aufgelistet:
- Logik kann in Form von POJOs angelegt werden
- Fertiges Basiscodegerüst, das kaum Veränderungen bedarf
- Kein Applikationsserver notwendig
- Ermöglicht Unit- und Integrations-Tests
- MVC-Architektur
- Aspektorientierte Programmierung mit AspectJ möglich
- Dependency Injection (externe Abhängigkeitsregulierung)
- Programmatisches Transaktions-Management