Der Stand der Dinge bei Spring: Spring 4.0, Spring Boot und Spring XD

Werkzeuge  –  4 Kommentare

Das Spring-Framework ist für den Einsatz in klassischen Java-Enterprise-Szenarien entworfen worden. Entzwischen hat sich ein ganzes Ökosystem um Spring gebildet, das ebenfalls Beachtung verdient.

Gut zehn Jahre ist es her, dass Version 1.0 des quelloffenen Frameworks für die Java-Plattform der Öffentlichkeit übergeben wurde. Mittlerweile liegt Spring in Version 4.0 vor, deren wesentliche Neuerungen sich wie folgt zusammenfassen lassen:

  • Die aktuelle Version unterstützt neue Varianten bekannter Techniken, worunter etwa Java 8 fällt. Spring kommen beispielsweise die dort enthaltenen Lambda-Ausdrücke zugute, mit denen sich unter anderem der Support für JDBC (Java Database Connectivity) oder JMS (Java Message Service) deutlich eleganter gestaltet. Minimal setzt Spring Java SE 6 voraus. Für die Unterstützung von Java EE ist Version 6 der APIs notwendig, allerdings lassen sich auch die aus Java EE 7 nutzen.
  • Bei der Konfiguration ist die Unterstützung der Groovy DSL neu. Sie stellt einen vergleichsweise einfachen und eleganten Weg dar, um Spring-Konfigurationen zu implementieren.
  • Um mit JavaScript-Anwendungen im Browser zu kommunizieren, lassen sich in Spring 4 WebSockets nutzen. Sie sind ein HTML5-Feature, das noch nicht alle Browser unterstützen, weshalb SockJS als Fallback integriert ist. Spring kann zudem mit STOMP (Streaming Text Oriented Messaging) umgehen, einem nachrichtenorientierten Protokoll, das oft gerade für die Kommunikation zwischen JavaScript und Servern über WebSockets oder SockJS zum Einsatz kommt.
  • Schließlich haben die Entwickler einige Verbesserungen am Testing-Framework vorgenommen.

Vor allem der Support für die neuen APIs und Java 8 rechtfertigt den Versionssprung. Das Update auf Spring 4.0 sollte relativ problemlos sein, allerdings haben die Entwickler einige als "deprecated" markierte APIs entfernt, was beim Aktualisieren zu beachten ist.

Rund um das Spring-Framework ist mittlerweile ein ganzes Ökosystem entstanden, zu dem ständig neue Projekte und Techniken hinzugefügt werden. Wichtiger als die neue Version von Spring ist daher, was gerade in diesem Ökosystem passiert.

Komplettpakete mit Spring Boot schnüren

Ein wichtiges neues Projekt ist Spring Boot, das auf einigen neuen Features aus Spring 4.0 aufbaut. Es ist momentan noch nicht ganz fertig, den dritten Release Candidate gibt es allerdings bereits. Auf den ersten Blick scheint Spring Boot nur ein weiteres Tool zu sein, das die schnellere Implementierung von Anwendungen verspricht – es ist aber weit mehr.

Schon von Anfang an hatte Spring Einfluss auf die Infrastruktur der mit dem Framework entwickelten Anwendungen. Sie kommen oft ohne Application-Server aus, ein einfacher Tomcat als Web-Container ist meistens ausreichend. Spring Boot geht weiter: Die Anwendung bringt einfach einen Web Server mit. Dazu ist sie lediglich mit einem Befehl wie

mvn package

mit Maven zusammenzupacken (Gradle lässt sich ebenfalls verwenden). Das Ergebnis ist ein einziges JAR-File, das sich mit

java -jar <jar-file>

starten lässt, es sei denn, man nutzt gleich

mvn spring-boot:run

Die Anwendung ist ein normaler Java-Prozess, der sich zum Beispiel vergleichsweise einfach mit einem Debugger untersuchen lässt. Da die Applikation ihren eigenen Server mitbringt und eine zusätzliche Installation deshalb nicht nötig ist, kann man den Betrieb mit Spring Boot massiv vereinfachen. Konfigurationsprobleme beim Server oder Versionsinkompatibilitäten zwischen Application Server und Anwendung sind ausgeschlossen.

Technisch ist die Lösung recht schlicht: Im JAR-File sind neben der Anwendung der Web-Server und alle benötigten Bibliotheken vorhanden. Tomcat oder Jetty können schon länger als eingebettete Server laufen, das Vorgehen ist also erprobt. Normalerweise ist es hingegen schwierig, die Anwendung und den Application Server entsprechend zusammenzupacken. Listing 1 im Exkurs zeigt, dass das mit dem Maven-Build eines Spring-Boot-Projekts nicht der Fall ist.

Im Wesentlich erbt der Build nur von einem Parent-Project-Object-Model (POM) von Spring Boot und nutzt das Maven-Plug-in des Projekts. Darüber hinaus gibt es noch eine Abhängigkeit zu einem Spring-Boot-Starter-Projekt. Letzteres definiert die Abhängigkeiten zu Spring, Tomcat und allen anderen benötigten Bibliotheken. Starter gibt es in unterschiedlichen Varianten, mit denen sich etwa andere Webserver wie Jetty nutzen oder Features für das Monitoring hinzufügen lassen. Außerdem ist es vergleichsweise einfach möglich, Bibliotheken wie Spring Data JPA hinzuzufügen. Das POM lässt sich um beliebige weitere Abhängigkeiten ergänzen, hier führt Spring Boot zu keinerlei Einschränkungen.

Aber die Optimierung der Abhängigkeiten ist nicht alles: Defaults vereinfachen die manuelle Spring-Konfiguration. Intern kommen dabei Features aus Spring 4.0 zum Einsatz. Letzteres erlaubt es beispielsweise, mit der @Conditional-Annotation abhängig von der Umgebung bestimmte Spring Beans zu erzeugen. Wenn eine In-Memory-Datenbank im Pfad ist, generiert Spring Boot zudem automatisch eine DataSource für die Datenbank. Ein Eingriff durch manuelle Konfiguration ist dennoch möglich.

Der folgende Codeausschnitt zeigt schließlich, wie Spring Boot in Java gestartet wird. Dazu übergibt man der main-Methode lediglich eine Klasse, die mit @EnableAutoConfiguration annotiert ist. Das stößt die automatische Konfiguration an, die beispielsweise im Anschluss DataSources erzeugt, und startet außerdem einen Suchvorgang nach weiteren annotierten Klassen im selben Package, die dann Spring Beans werden. Die Klasse aus dem Ausschnitt ist folglich zugleich ein Controller, der auf HTTP-Requests reagiert. Zudem baut Spring Boot die gesamte notwendige Infrastruktur inklusive Web-Server, DispatcherServlet und so weiter auf.

@RestController
@EnableAutoConfiguration
public class SampleController {

@RequestMapping("/")
String home() {
return "Hello Spring Boot!";
}

public static void main(String[] args) throws Exception {
SpringApplication.run(SampleController.class, args);
}

}

Noch einfacher ist die Nutzung mit Groovy. Dann muss man lediglich das entsprechende Skript per Kommandozeile mit Spring Boot ausführen, um die passende Infrastruktur zu erzeugen. Weder ein Kompiliervorgang noch das Maven-POM sind dann notwendig.

Spring Boot geht also mehrere Probleme an: Statt eines Application Server lässt sich ein JAR-File nutzen, das die komplette Ablaufumgebung inklusive eines Webservers mitbringt. Das erleichtert das Deployment und hilft außerdem bei der Entwicklung von Micro Services. Letzteres beschreibt ein Modularisierungskonzept, bei dem beispielsweise einzelne Module mit einem REST-Interface in einem Webserver laufen. Ergänzt man eine Abhängigkeit zum Spring Starter Actuator, lassen sich die beschriebenen Dienste zudem überwachen.