Spring oder Spring Boot – das ist hier die Frage!

23.04.2020

Immer mal wieder erreicht mich die Frage, was denn eigentlich der Unterschied zwischen Spring und Spring Boot ist. Mit diesem Artikel möchte ich ein wenig Licht ins Dunkel bringen.

Die Tatsache dass die Begriffe „Spring“, „Spring Framework“ und „Spring Boot“ gerne synonym verwendet werden, macht die Unterscheidung nicht einfacher. Daher möchte ich differenzieren zwischen dem „Spring Framework“ und „Spring Boot“. Der Begriff „Spring“ dagegen schließt beides ein und beinhaltet alles, was die Spring-Welt insgesamt zu bieten hat.

Das Spring-Framework

Spring FrameworkLaut offizieller Dokumentation handelt es sich beim Spring Framework um „ein umfassendes Programmier- und Konfigurationsmodell für moderne Java-basierte Unternehmensanwendungen – auf allen möglichen Deployment-Plattformen. […] Spring fokussiert sich auf das ‚Verdrahten‘ von Unternehmensanwendungen, ohne unnötige Bindungen an spezifische Deployment-Umgebungen“
(Quelle: https://spring.io/projects/spring-framework)

Das Spring Framework ist also eine Sammlung von Tools für die Entwicklung von Geschäftsanwendungen. Zu seinen Kernfunktionalitäten gehören Dependency Injection, Events, Ressourcen, Internationalisierung, Datenzugriff mit Transaktionen, Integration und etliches mehr.

Spring Boot

Spring Boot setzt auf dem Spring Framework auf und soll eine sehr einfache Entwicklung von lauffähigen und produktionsreifen Spring-Anwendungen ermöglichen. Dies wird durch einen Autokonfigurations-Mechanismus erreicht, der die Tools aus dem Spring Framework, sowie eine Reihe weiterer Tools, auf sinnvolle Art und Weise vorkonfiguriert. Mit „Konfiguration“ ist an dieser Stelle übrigens die Konfiguration der Spring-Beans gemeint die bestimmt, welche Beans für Dependency Injection zur Verfügung stehen und wie diese miteinander „verdrahtet“ werden – und nicht die Konfigurations-Properties, die man etwa in der application.properties pflegt.

Beispielsweise bringt Spring Boot Web standardmäßig einen eingebetteten Tomcat-Container mit, der auf Port 8080 läuft – und das ohne dass man irgendetwas selbst konfigurieren muss. Den Port kann man ändern, in dem man in der application.properties unter server.port einfach einen anderen Wert einträgt. Statt Tomcat kann man auch einen anderen Servlet-Container verwenden. Dafür muss man lediglich den Tomcat in der Maven- oder Gradle-Konfiguration exkludieren und die Dependency für einen anderen Container, wie etwa Jetty, hinzunehmen.

Auch andere Aspekte wie z.B. Spring Data, Spring Security u.ä. können einer Anwendung hinzugefügt werden, indem man einfach nur Dependencies in die Build-Konfiguration mit aufnimmt. Spring Boot erkennt dann allein durch das Vorhandensein bestimmter Klassen oder Konfigurations-Properties, dass eine Funktionalität aktiviert werden soll, und erzeugt automatisch die dafür notwendigen Spring-Beans. Ist z.B. HikariCP im Klassenpfad vorhanden, wird automatisch eine HikariDataSource-Bean erzeugt. Ist stattdessen DBCP2 im Klassenpfad (und Hikari exkludiert), wird statt Hikari der DBCP2-Connection-Pool für die Data Source verwendet. Für Spring Data JPA werden automatisch Hibernate und Transaktionen aktiviert.

Des weiteren registriert Spring Boot eine ganze Reihe von @PropertySources, so dass Anwendungs-Properties automatisch aus sage und schreibe 17 verschiedenen Quellen gelesen werden – u.a. der application.properties, application.yaml, Kommandozeilenparametern, OS-Systemvariablen, Java System Properties u.v.m. Die komplette Liste ist hier zu finden:
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/.

Das spring-boot-maven-plugin packt die Anwendung zusammen mit allen benötigten Bibliotheken in eine „Fat Jar“, die mit java -jar my-app.jar gestartet werden kann.

Zu guter letzt bringt Spring Boot ein sehr umfangreiches Dependency Management mit, in der die Versionen für die Spring-Bibliotheken, aber auch für viele 3rd-Party-Libs (z.B. Apache Commons, Hibernate, JUnit, Mockito u.v.m.) aufeinander abgestimmt und gepflegt sind. So kann man sich diese Bibliotheken ins Projekt holen, ohne deren Versionen selbst pflegen zu müssen.

Mit dem Spring Initializr kann man sich übrigens in Windeseile ein neues Spring-Boot-Projekt erstellen lassen, mit dem man direkt und ohne Initialaufwand die Entwicklung starten kann. Der Initializr ist verfügbar als Web-UI, Kommandozeilentool, für HTTP-Clients wie cURL, oder sogar direkt aus IDEs  (z.B. IntelliJ IDEA) heraus.

Fazit

Das Spring Framework ist ein Toolset zur Entwicklung von Unternehmensanwendungen für alle möglichen Deployment-Plattformen. Spring Boot setzt darauf auf und bietet viele Komfortfunktionen, die einen schnellen Projektstart ermöglichen und vernünftig vorkonfiguriert sind, aber dennoch sehr flexibel per Konfiguration an die jeweiligen Bedürfnisse angepasst werden können.

Wer mehr über Spring Boot und die Details des Autokonfigurations-Mecanismus wissen möchte, findet hier eine ausführliche Erläuterung:
https://www.marcobehler.com/guides/spring-boot.

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*