Spring Boot: die wichtigsten Features für ein sauber konfiguriertes Projekt
Spring Boot ermöglicht uns das Erstellen neuer Spring Anwendungen in wenigen Minuten. Dazu bringt es vorkonfigurierte Spring Boot Starter und 3rd Party Bibliotheken mit, die ohne weitere Anpassungen produktionsbereit sind. In diesem Artikel stelle ich dazu die wichtigsten Spring Boot Features genauer vor.
Alleinstehende Spring Anwendungen mit eingebettetem Tomcat
In diesem Tutorial zeige ich euch, wie ihr eine neue Spring Boot Anwendung erstellt. Das ist eine alleinstehende Anwendung, da sie einen integrierten Tomcat Application Server hat und durch den Build Prozess in eine mit Java ausführbare jar-Datei gepackt wird.
Spring Boot EntwicklerInnen müssen also keinen Application Server installieren und dann die gebaute Anwendung (z.B. als WAR Datei) deployen, sondern können einfach eine jar-Datei mittels folgendem Befehl starten:
java -jar <Pfad zur jar-Datei im target Verzeichnis>
java -jar <Pfad zur jar-Datei im target Verzeichnis>
Der eingebettete Tomcat ist eine 3rd Party Bibliothek, die Spring Boot mitbringt. Dieser Tomcat hat eine lauffähige und produktionsreife Vorkonfiguration von Spring Boot, die wir bei Bedarf anpassen können. Wir könnten den Tomcat auch durch einen vorkonfigurierten und eingebetteten Jetty oder Undertow Application Server austauschen - im reaktiven Spring Projekt macht das Spring Boot für uns.
Die Maven Konfiguration eines einfach gehaltenen Spring Boot Projektes für eine Web-Anwendung sieht so aus:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- spring-boot-starter-thymeleaf liefert die von Spring Boot vorkonfigurierte html Template Engine Thymeleaf. Mehr dazu gibt es hier: spring-mvc-thymeleaf.html
- spring-boot-starter-test liefert uns die verbreitetsten Testframeworks.
- spring-boot-starter-web enthält den eingebetteten und vorkonfigurierten Tomcat Application Server. Im folgenden Screenshot sieht man die Hierarchie der jar-Dateien und damit auch den eingebetteten Tomcat.
Tomcat-embed Bibliotheken in Spring Boot Starter Dependencies |
Vorkonfigurierte Starter Dependencies
Die Spring Boot Maven Konfiguration
Das wichtigste bzw. komfortabelste Feature von Spring Boot sind die vorkonfigurierten Starter Dependencies. Das erste Beispiel dafür haben wir schon mit dem eingebetteten Tomcat gesehen.
Wenn wir die Starter Dependency spring-boot-starter-web in der Version 2.6.3 definieren, bekommen wir damit unter anderem die spring-boot-starter-tomcat Dependency in der Version 2.6.3. Alle Spring Boot Starter Dependencies erben ihre Version im Standard von Spring Boot Maven Parent POM. Auf diese Weise wird sichergestellt, dass die Spring Boot Version nur an einer Stelle festgelegt wird und somit auch nur an einer Stelle geändert werden muss - im folgenden pom.xml Ausschnitt fett markiert:
Wenn wir die Starter Dependency spring-boot-starter-web in der Version 2.6.3 definieren, bekommen wir damit unter anderem die spring-boot-starter-tomcat Dependency in der Version 2.6.3. Alle Spring Boot Starter Dependencies erben ihre Version im Standard von Spring Boot Maven Parent POM. Auf diese Weise wird sichergestellt, dass die Spring Boot Version nur an einer Stelle festgelegt wird und somit auch nur an einer Stelle geändert werden muss - im folgenden pom.xml Ausschnitt fett markiert:
<project xmlns=...>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
...
Spring Boot übernimmt für uns einen Großteil der Dependency Definitionen in unserer Maven oder Gradle Build Konfiguration. Innerhalb jeder Spring Boot Starter Dependency befinden sich die typischer Weise benötigten 3rd Party Bibliotheken, um ein System mit allen notwendigen Features auszustatten. Dabei sorgt Spring Boot dafür, dass die Versionen der 3rd Party Bibliotheken untereinander kompatibel sind. Spring Boot definiert also für jede verwendete Bibliothek die passende Version. Das haben wir schon beim spring-boot-starter-tomcat gesehen, da z.B. die Bibliotheken jakarta.annotation-api in Version 1.3.5 und tomcat-embed-core in Version 9.0.56 von Spring Boot für uns definiert wurden (siehe Screenshot weiter oben). Wir müssen also nicht herausfinden, dass genau diese beiden Versionen miteinander kompatibel sind (könnten es aber bei Bedarf überschreiben). Andere Beispiele für Spring Boot Starter Dependencies haben ich in diesen Blog-Artikel vorgestellt:
- spring-boot-starter-validation liefert alle Dependencies für die Validierung mit Hibernate, siehe validation-with-spring.html
- spring-boot-starter-data-mongodb liefert alle Dependencies für die Verwendung einer Mongo Datenbank, siehe mongodb-mit-spring-boot.html
Spring Boot Konfigurations-Parameter
Neben den Maven Dependencies bringen die Spring Boot Starter Dependencies noch eine Vorkonfiguration bzw. Auto-Konfiguration mit: spring-boot-autoconfigure in der Version passend zum Spring Boot Maven Parent POM. Mit dieser Bibliothek konfiguriert Spring Boot für uns alle mitgebrachten 3rd Party Bibliotheken. Diese Konfiguration entspricht produktionsbereiten Standard-Werten, damit wir möglichst schnell mit dem Entwickeln loslegen können. Außerdem werden dort die Namen der Konfigurations-Parameter festgelegt, um die Werte zu überschreiben.
package org.springframework.boot.autoconfigure.web;
...
@ConfigurationProperties(prefix = "server",
ignoreUnknownFields = true)
public class ServerProperties {
/**
* Server HTTP port.
*/
private Integer port;
...
/**
* Type of shutdown that the server will support.
*/
private Shutdown shutdown = Shutdown.IMMEDIATE;
...
- Die Klasse ServerProperties befindet sich in der Bibliothek spring-boot-autoconfigure und ist somit Teil der Auto-Konfiguration.
- @ConfigurationProperties(prefix = "server" legt den Prefix der verwendbaren Spring Konfigurations-Parameter fest. Der Parametername ist dann eine Kombination aus Prefix und Attributname, z.B. server.port oder server.shutdown
- Im Fall von server.shutdown sehen wir, dass die Spring Boot Auto-Konfiguration festgelegt hat, dass das Herunterfahren IMMEDIATE ist.
- Anmerkung: server.port hat keinen Wert von Spring Boot Auto-Konfiguration erhalten, da hier der Standard-Wert 8080 innerhalb der 3rd Party Library gesetzt ist.
- Auto-Konfigurationsparameter können wir bei Bedarf in unserer Spring Konfiguration überschreiben. Z.B. ist das Überschreiben mit der Datei application.properties möglich. Für die beiden zuvor gezeigten Beispiele, geht das so:
server.port=12345
server.shutdown=graceful
Tipp: Arbeite nicht gegen Spring Boot!
Ich habe einige, riesige Maven Konfigurationen gesehen, die sehr viele Spring Dependencies mit selbst gemanagten Versionen enthielten, obwohl man glaubte Spring Boot zu verwenden. In diesen Fällen profitiert Ihr nicht vom besten Spring Boot Feature, den Starter Dependencies und dem getesteten Versionsmanagement durch das Spring Boot Team.
Eine saubere Spring Boot Maven oder Gradle Konfiguration hat:
- als Parent das Artefakt spring-boot-starter-parent und nur hier wird die Spring Boot Version von uns gepflegt.
- wann immer möglich eine spring-boot-starter-Dependency anstelle von anderen Dependencies mit spring im Namen.
- spring- und andere von Spring gemanagte Dependencies (z.B. Lombok) ohne Versionsangabe.
Solltet ihr beim Prüfen eurer Build-Konfiguration Verstöße gegen diese 3 Punkte finden, empfiehlt sich hier ein Refactoring.
Kommentare