Spring Boot

Was ist Spring Boot?

Mit Spring Boot hat die Spring Community eine echte Vereinfachung bei der Erstellung Spring-basierter Anwendung erreicht. Damit können mit wenigen Programmzeilen Prototypen selbst komplexer Anwendungen erstellt werden, die anschließend zum fertigen Produkt konfiguriert werden können. Der Funktionsumfang von Spring Boot umfasst:

  • Build-Management
    • Ein Spring Boot-Projekt kann mit einer simplen Build-Definition gebaut werden.
  • Projekt-Generator
    • Zur Neuanlage eines Projektes kann die Build-Konfiguration mit einem Online-Dienst der Spring-Community erstellt werden.
  • Convention over Configuration und Autoconfiguration
    • Für Rapid Prototyping sind keine Konfigurationsdateien oder Ähnliches vonnöten. Die Anwendung ist nach der Erstellung sofort lauffähig. Dies gilt auch dann, wenn beispielsweise für eine Web-Anwendung ein Server benötigt wird: Die Autoconfiguration startet einfach einen Tomcat auf Port 8080.
  • Externe Konfiguration
    • Für die ausgelieferte Programmversion muss selbstverständlich eine explizite Konfiguration erfolgen, die Autoconfiguration ist hierfür bestenfalls bedingt geeignet. Dazu bietet Spring Boot einen einfachen Mechanismus über Properties- oder YAML-Dateien. Eine Annotation-basierte Konfiguration ist natürlich auch möglich.
  • Monitoring der Runtime
    • Die in Produktion laufende Anwendung wird prnzipiell wie alle Java-Anwendungen über JMX überwacht. Mit dem Spring Actuator werden zusätzliche Metriken hinzugefügt, die via REST-Schnittstelle abgegriffen werden können.

Die einzelnen Funktionen werden im Folgenden detaillierter beschrieben.

Features

 Build Management

Der Build-Prozess einer Spring Boot-Anwendung wird über Gradle oder über Maven definiert. Die Grundideen sind in beiden Systemen die selben und werden hier an einem Maven-Projekt beschrieben:

Als erstes stellt Spring Boot eine Parent-POM zur Verfügung, in der alle (!) möglichen Spring-Dependencies einer Applikation abstrakt deklariert sind:

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
		<relativePath />
	</parent>

Ein konkretes POM eines Projekts definiert als Dependencies die Teile des Frameworks, die benutzt werden sollen durch “Starter”. So wird im folgenden Beispiel ein Projekt mit der Spring Core-Komponente sowie der Test-Umgebung definiert:

 

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

Projekt Generator Spring Initializr

Mit Hilfe des online verfügbaren Projekt-Generators Spring Initializr wird ein POM für ein Projekt sowie eine simple Rahmenanwendung generiert. Die notwendigen Starter können durch eine einfache Oberfläche hinzugefügt werden. Das fertige Projekt wird als Archiv geladen werden.

Convention over Configuration und Autoconfiguration

Eine Spring Boot-Anwendung wird über eine zentrale Einstiegsklasse definiert, die mit @SpringBootApplication annotiert ist.  Damit sind die folgenden Features automatisch aktiviert:

  • Diese Klasse ist automatisch eine @Configuration
  • ComponentScan für alle Unterpakete, so dass automatisch alle @Components gefunden werden
  • Automatisches Laden der application.properties oder alternativ einer application.yaml zur Anwendungs-Konfiguration. Hierin werden Anwendungs-spezifische Konfigurationen definiert, aber auch die restliche Konfiguration (Logging, Ports, URLs…) werden hier zentral gepflegt.
  • Spring-Profile werden unterstützt. So werden Profile-abhängige Konfigurationen wie application-<profile>.properties automatisch erkannt und gemerged.

 

Zusätzlich wird eine Autokonfiguration angeboten, die einiges an Hintergrund-“Magie” durchführt. Dies sei an einem konkreten Beispiel demonstriert:

  • Die Anwendung benötigt eine Datenbank und deklariert somit in seinem POM den Starter für JDBC.
  • Zusätzlich wird ein Datenbanktreiber angegeben.
  • Jetzt startet die Autokonfiguration und erzeugt automatisch eine DataSource. Dazu wird untersucht, ob der angegebene  Datenbank-Treiber eine Embedded-Konfiguration ermöglicht. Hier sind aktuell H2, Derby und die HSQLDB unterstützt.

Diese Autokonfiguration kann aber beispielsweise auch einen kompletten Jetty-Server konfigurieren und starten. Dazu ist nur der Web-Starter zu inkludieren.

Externe Konfiguration

Die eben besprochene Autoconfiguration ist für Prototyping sehr praktisch. Für reale Anwendungen muss diese jedoch durch explizite Konfiguration ersetzt werden, also beispielsweise den Port des Jetty-Servers oder eine DataSource. Dazu bietet Spring Boot

  • die application.properties
    • spring.datasource.user=Hugo
  • Aufruf-Parameter der Anwendung
    • -Dspring.datasource.user=Hugo
  • Falls zumindest eine DataSource definiert ist wird die Autokonfiguration nicht durchgeführt.

Monitoring

Der Spring-Actuator stellt umfangreiche Informationen via JMX oder über eine REST-Schnittstelle zur Verfügung. Darin werden nicht nur die aktuellen Metriken des Java-Prozesses angezeigt sondern auch beispielsweise das Geflecht der Spring-Beans.

Das Hinzufügen des Actuators erfolgt wie bei Spring Boot üblich durch das Hinzufügen des Starters zum POM. Welche Endpoints aktiviert werden wird in der application.properties definiert.

Ebenso einfach können die Metriken über Jolokia abgegriffen werden.

Fazit

Spring Boot wird zwar als Ergänzung zum Spring-Framework angeboten, ist nach meiner Auffassung aber so überzeugend, dass selbst simple Projekte damit realisiert werden sollten. Selbst wenn “nur” der Build-Prozess mit Parent Startern benutzt wird, ist der Mehrwert den Aufwand der Einarbeitung in jedem Falle wert. Dies beschreibt ein anderer Artikel zu Spring Boot, darin wird ein RESTful Web Service mit Datenbank-Anbindung programmiert. Die Datenbank-Anbindung mit Spring Data ist Thema eines weiteren Artikels.


Seminar zum Thema

Dr. Rainer Sawitzki / Dr. Rainer Sawitzki

Nach seinem Studium der Physik und anschließender Promotion Wechsel in die IT-Branche. Seit mehr als 20 Jahren als Entwickler, Berater und Projektleiter vorwiegend im Bereich Java und JavaScript unterwegs. Parallel dazu in der Entwicklung und Durchführung von hochwertigen Seminaren für die Integrata im Einsatz.

Schreibe einen Kommentar