Spring Boot – und gut?

Dieser Vortrag soll einen Überblick über das Spring Framework und Spring Boot liefern. Dadurch soll ein Bewusstsein dafür geschaffen werden, für welche Anwendungsgebiete Spring sich eignet und für welche nicht. Außerdem soll er als Grundlage zur Abgrenzung zu unserem eigenen auf .NET basierendem Anwendungsserver und RAD-Framework (Rapid Application Development) CoreFrame dienen.

Was ist das Spring Framework? – Und was ist es nicht?

Spring basiert auf Rod Johnsons Buch Expert One-On-One J2EE Design and Development (2002). Der Hauptentwickler Pivotal ist inzwischen ein Joint Venture von VMWare und General Electric. Es wird seit 2003 sehr aktiv weiterentwickelt. Aktuelle Version 5.0.7 (Stand 06.2018). Oft wird Spring als „Framework of Frameworks“ beschrieben, weil es viele bestehende Frameworks integriert. Der Grundsatz ist: „Wenn es schon ein gutes Framework gibt, wird es integriert und nicht erneut implementiert“. Das Spring Framework unterstützt die Entwicklung in Java, Groovy und Kotlin und soll

  • die Entwicklung von Enterprise-Anwendungen vereinfachen
  • gute Programmierpraktiken fördern
  • Applikationskomponenten entkoppeln und
  • Gluecode und Redundanz reduzieren

Im Gegensatz zu Jakarta EE (aka Java EE) handelt es sich um konkrete Frameworks und nicht um eine abstrakte API-Spezifikationen.

Was kann das Spring Framework?

Der Spring Framework Core
Ein Hauptfeature von Spring ist die Unterstützung aspektorientierter Programmierung, die im Wesentlichen durch Dependency Injection mit Hilfe des Inversion of Control Containers (Spring Context) erreicht wird. Dieser deckt zwar nicht alle Anforderungen an AOP ab. Jedoch laut eigener Aussage „80 % der wichtigsten Anforderungen an AOP im Bereich der Enterprise-Entwicklung.“ Für tiefergehende AOP-Anforderungen wird AspectJ unterstützt.

Ein weiterer wichtiger Aspekt ist die oben genannte Integration von Frameworks, wie z. B. Hibernate, Flyway, JUnit, Mockito, Thymeleaf, Jackson, log4j und sehr viele weitere. Außerdem werden durch Module weitere Abstraktionsschichten für viele Anwendungsbereiche wie Persistierung, Datenzugriff, Sicherheit, MVC, Messaging, u.v.m. angeboten.

Für die Entwicklung werden einige Eclipse-Plugins angeboten, die zusammengenommen als angepasste Version von Eclipse, der „Spring Tool Suite“ (STS), heruntergeladen werden können. Das Spring Framework ist extrem gut dokumentiert und die Community ist sehr aktiv. Da das Projekt bereits 15 Jahre alt ist muss jedoch bei Community-Beiträgen immer darauf geachtet werden, dass die angebotenen Informationen noch aktuell sind. Die Konfiguration von Spring erfolgt mittlerweile meist durch Annotationen. Die Konfiguration per XML und in Java-Code ist jedoch auch möglich.

Module
Ein Großteil der Funktionalitäten von Spring ist in die 204 Module ausgelagert. Davon wer-den ca. 50 aktuell noch aktiv weiterentwickelt, von denen im Folgenden einige beschrieben werden sollen.

Spring Data
Spring Data unterstützt den Zugriff auf relationale und NoSQL-Datenbanken. Die Basis bildet die JPA (Jakarta EEs Java Persistence API). Der Zugriff auf Datenbanken erfolgt mit Hilfe von teilweise selbstimplementierender Repositories (DAOs). Auch der reaktive Zugriff auf NoSQL-Datenbanken wird unterstützt. Das OR-Mapping und der Zugriff auf die Datenbanken wird technisch von unterschiedlichen Frameworks durchgeführt (z. B. Hibernate, OpenJPA, EclipseLink). So wird eine Vielzahl an Pooling-Frameworks und DBMS unterstützt.

Spring Security
Spring Security unterstützt mit Hilfe von verschiedenen abstrahierenden Klassen sowohl die Authentifizierung als auch die Autorisierung von Benutzern. Es werden dabei ganz unterschiedliche Systeme wie LDAP, JAAS, OpenID, ACL, Rollensysteme und viele weitere angeboten. Außerdem wird der Entwickler durch Hilfsfunktionen beim Schutz der Anwendung vor verschiedenen Angriffsarten wie Session fixation, Clickjacking, Cross Site Request Forgery, etc. unterstützt.

Web UI Module
Für die Umsetzung von Web-Oberflächen werden unterschiedliche Techniken angeboten. Spring MVC bietet Unterstützung für klassische MVC- und REST-Architekturen. Es werden unterschiedliche Template-Engines für die Views bereitgestellt und die Implementierung von Controllern durch einfache Annotationen unterstützt. Spring WebFlux bietet ähnliche Funktionalitäten wie Spring MVC. Der große Unterschied ist, dass die Zugriffe reaktiv sind. D. h., dass Flux- bzw. Mono-Streams, statt abgeschlossener Ergebnisse, an den Browser zurückgegeben werden. Threads blockieren bei langlaufenden Anfragen nicht.

Vaadin ist ein stark beworbenes, jedoch relativ unflexibles UI-Framework für Single-Page-Web-Oberflächen. Es handelt sich dabei nicht um ein offizielles Spring-Modul. Die Logik und das Layout werden, ähnlich wie bei Java Swing-Oberflächen, in Java-Klassen erstellt, sodass der Entwickler keine Kenntnisse in HTML oder JavaScript benötigt.

Weitere Module
Neben den genannten, werden noch viele weitere Module angeboten, auf die hier nicht im Detail eingegangen werden kann. Einige davon sind

  • Spring Roo: Rapid Application Development und Low code
  • Spring Testing: Unit-Tests, Integrationstests
  • Spring Cloud: Tools für die Entwicklung verteilter Anwendungen (configuration management, service discovery, leadership election, distributed sessions, etc.)
  • Lombok: Automatische, implizite Implementierung von Gettern, Settern, Konstruktoren
  • Spring Batch
  • Statemachine
  • Spring Mobile
  • uvm.
Spring Boot

Welches Problem löst Spring Boot?
Das Spring Framework besteht aus sehr vielen Modulen und integriert sehr viele Frameworks. Der Entwickler muss bei der Entwicklung die richtigen Abhängigkeiten in der passenden Version auswählen und jede Komponente korrekt konfigurieren. Getreu dem Motto „Convention over Configuration“ wählt Spring Boot kontextabhängig die sinnvollsten Abhängigkeiten und konfiguriert diese automatisch. Das ist ein wesentlicher Vorteil gegenüber Spring.

Features
Essentiell sind hierfür die Spring Boot Starter, die selbst als Abhängigkeit in Maven oder Gradle definiert werden. Dies sind JAR-Dateien, die wiederum Abhängigkeiten zu benötigten Frameworks und Daten zur kontextabhängigen Standardkonfiguration beinhalten. Abhängig von den vorhandenen Frameworks im Classpath und von den existierenden Konfigurationsdateien konfiguriert Spring Boot die Anwendung automatisch, wobei natürlich alle Parameter manuell überschrieben werden können. Das Versionsmanagement basiert auf Maven BOM (Bill of Material). Nur für die wichtigsten Abhängigkeiten wird noch die konkrete Version angegeben, die Version aller anderen Abhängigkeiten wird automatisch passend dazu abgeleitet.

Module
Auch Spring Boot unterstützt Module von denen hier einige genannt werden sollen.

  • Actuator: Das Actuator-Modul stellt automatisch HTTP-Endpunkte für das Applicationmanagement bereit. Beispiele für die insg. 21 Endpunkte sind health, info, metrics, sessions. Es können auch eigene Endpunkte implementiert werden.
  • Developer Tools: Die Developer Tools unterstützen den Entwickler indem Caches (auch von versch. Modulen) deaktiviert werden und Klassen, und Browser automatisch neu geladen werden. Wenn nötig wird die Anwendung bei Änderungen am Quellcode automatisch neu gestartet.
Fazit

Der Funktionsumfang von Spring und Spring Boot mit ihren Modulen ist extrem groß und baut auf modernen Architekturen und Techniken auf. Dadurch ist das Spring Framework für viele Anwendungszwecke gut geeignet. Dank der sehr guten Dokumentation und der straken Community muss man selten lange nach Antworten suchen. Alleine Spring + Spring Boot stellt durch die automatische Konfiguration und die Unterstützung bei der Abhängigkeitsverwaltung oft schon eine Verbesserung zum Start „auf der grünen Wiese“ dar. Allerdings ist die Lernkurve steil. Um die Eignung von Spring für Projekte und Auswahl der passenden Module festzustellen ist viel Hintergrundwissen nötig. Auch für die Entwicklung müssen zuerst viele Grundlagen erlernt werden.