Veröffentlichungsdatum
Erfahrungsgrad

Erfahrungsgrad: Einsteiger

Eine kurze Einführung in das Spring Framework

Wer sich mit moderner Java-Entwicklung auseinandersetzt, wird um das Spring Framework nicht drum herum kommen. In diesem Artikel wollen wir uns anschauen, was es so besonders kann und was die Alleinstellungsmerkmale sind.

Inhaltsverzeichnis

Was ist das Spring Framework überhaupt?

Das Spring Framework kann man sich wie eine Art Werkzeugkoffer vorstellen. Dort sind alle notwendigen Werkzeuge enthalten, damit wir einfach und effizient Geschäftsanwendungen in Java entwickeln können. Meistens ist von "Enterprise Applications" die Rede. Das klingt immer ganz fancy, aber insgeheim weiß keiner so genau, was man damit meint. Ich versuche es mal zu erläutern. Ich verstehe darunter Software, die...

  • ... in einem geschäftlichen Kontext genutzt wird,
  • ... in ihrer Funktionalität komplexer ist und in verschiedene, von einander trennbare Module eingeteilt werden kann,
  • ... die mit mehreren Systemen kommuniziert und
  • ... an welcher mehrere Entwickler beteilt sind.

Im Endeffekt geht es darum, so wenig Reibungsverluste wie möglich in einem komplexen Umfeld zu erzeugen. Dafür braucht es einheitliche Standards und Vorgehensweisen - und genau dafür ist ein Framework wie Spring da: um einen Rahmen zu schaffen, den alle verstehen und auf welchen sich alle einigen. Das Herz des Spring Ökosystems sind die Module des Core Containers, darunter zählen Dinge wie:

  • Dependency Injection
  • Beans
  • Spring Expression Language (SpEL)
  • Aspektorientierte APIs

Und gerade die Mechanismen rund um die Dependency Injection sind die Dinge, die Spring so mächtig machen. Deswegen steigen wir da mal genauer ein und schauen uns an, warum das so wichtig ist.

Spring als Dependency Injection Container

  • Was sind Abhängigkeiten?
  • Warum Dependency Injection?
  • Loose gekoppelter Code - Beispiel Steckdose
  • DI Container und Inverison of Control

Steigen wir mal bei der Dependency Injection kurz genauer ein. In Java arbeiten wir viel mit Klassen und Objekten. Diese haben gewisse Eigenschaften und können Aktionen ausführen, auf Deutsch gesagt: sie haben Variablen und Methoden. Objekte können Abhängigkeiten von oder zueinander haben. Damit ein Autohaus ein Auto verkaufen kann, braucht es sowohl ein zu verkaufendes Auto, einen Käufer, als auch einen Verkäufer der das alles zustande bringt.

Technisch gesehen müssen wir das alles miteinander verbinden. Das Autohaus sorgt dafür, dass alle Beteiligten miteinander kommunizieren können: es ist quasi unser Container. Unser Objekt Auto, Käufer und Verkäufer wird nun verwaltet und wurde in unserem Java-Universum von einem "Plain Old Java Object (POJO)" zu einem "(Spring) Bean" befördert.

Spring Container Schaubild

Das ist die Aufgabe des Spring Containers, dieser instanziiert, konfiguriert und stellt die Beans bereit, damit wir als Entwickler mit diesen arbeiten können.

@Service
public class Parkplatzverwaltung {

    public void holeAutoVonParkplatz(String kennzeichen) {
        // return ...
    }

}

@Component
public class Verkaeufer {

    private final Parkplatzverwaltung parkplatzverwaltung;

    public Verkaeufer(Parkplatzverwaltung parkplatzverwaltung) {
        this.parkplatzverwaltung = parkplatzverwaltung;
    }

    public void verkaufe(String kennzeichen, String neuerBesitzer) {
        Auto auto = parkplatzverwaltung.holeAutoVonParkplatz(kennzeichen);
        auto.setBesitzer(neuerBeistzer);
        // yey!
    }

}

Bitte seht es mir nach, dass der Code oben nicht zu 100% Java konform ist. Aber das symbolisiert es nochmal ganz gut. Unser Verkäufer hat eine Abhängigkeit zur Parkplatzverwaltung, die in diesem Beispiel für die Bereitstellung der Autos sorgt. Über den Constructor des Verkäufers stellen wir diese Abhängigkeit zur Verfügung. Spring sorgt dafür (in diesem Fall durch die Annotationen), dass aus diesen Klassen verwaltete Beans werden, welche uns dann automatisch zur Verfügung gestellt werden. In diesem Beispiel ginge das natürlich auch ohne Spring, spannend wird es dann, wenn man es mit Datenbanken oder Message Queues zutun hat.

Was macht Spring so besonders?

Das Alleinstellungsmerkmal von Spring ist dessen Philosophie. Das Framework war 2003 eine Antwort auf die komplexen Spezifikationen der Java Enterprise Edition. Dabei steht Spring nicht in Konkurrenz zu Jakarta EE (ehemals Java EE), sondern kann als Ergänzung oder in Kombination genutzt werden. Teilweise implementiert Spring ausgewählte Spezifikationen selbst, wie etwa JPA, JMS oder Bean Validation.

Spring überlässt dir die komplette Kontrolle über deine Software. Egal wie tief zu in deinem Projekt drin bist, es ist nie zu spät an der Architektur zu rütteln. Ein Wechsel von MySQL auf Postgres? Geht klar! Die Persistenzschicht ist abstrahiert genug, sodass der dahinterliegende Treiber sehr wenig bis gar keinen Einfluss auf deine tatsächliche Geschäftslogik hat. Anders formuliert: an Spring soll dein Vorhaben nicht scheitern. Deswegen ist Flexibilität bei diesem Framework groß geschrieben, im Gegensatz zu anderen Frameworks wie bspw. Laravel in der PHP-Welt vertritt Spring weniger eine starke Meinung was Konventionen und Vorgehensweisen angeht sondern lässt sich aus vielen verschiedenen Perspektiven bedienen. Ausnahme: Spring Boot. Hier wird genau der Ansatz verfolgt, eine Meinung vorzugeben - die sich zwar ändern lässt - aber im Idealfall bestehen bleibt. Das sorgt auf der einen Seite für eine sehr schnelle Entwicklung, kann aber im Einzelfall bei einzelnen Anforderungen für Sonderlösungen führen, die auf den ersten Blick unsauber wirken.

Ebenfalls ist Spring sehr langlebig, das ist aber ein Aspekt, welcher fast das komplette Java Ökosystem mitbringt. Hier ist es wichtig, eine starke Rückwärtskompatibilität zu gewährleisten und so wenig wie möglich Breaking Changes zu verursachen. Das ist gerade bei komplexen Geschäftsanwendungen wichtig. Diese müssen beständig und stabil sein, da darf sich nicht jede Woche etwas an den Schnittstellen ändern - schließlich sind wir hier nicht im Frontend bei dem 1000sten JavaScript Framework unterwegs. (Sorry </3)

Warum benutzen Entwickler Spring?

Es funktioniert einfach. Ich sag's dir. (Zitat Noel, jetzt gerade)

Spring funktioniert einfach, vor allem seit Spring Boot was uns einiges an XML-Konfigurationen erspart und mehr einen deklarativen Ansatz über Java Annotationen angeht. Unten seht ihr den Code für einen komplett funktionsfähigen Webservice, der einen GET-Endpunkt bereitstellt und den String "Hello World!" zurückgibt. Das sind 8 Zeilen Code. 8 Zeilen. Und von dort an kann man ansetzen und weiter Funktionalitäten einbauen. Testing, Datenbanken, Mails - all das ist schnell gemacht und alle Komponenten sind miteinander abgestimmt.

@SpringBootApplication
@RestController
public class DemoApplication {

    @GetMapping("/helloworld")
    public String hello() {
        return "Hello World!";
    }

}

Wenn du mehr über die Implementierung von Webservices in Spring erfahren möchtest, dann schau dir gerne mein Einsteigertutorial über Spring Boot an.

Ach, und das Ökosystem, ganz vergessen. Das ist auch echt krass.

Ein Framework ist nur so gut wie seine Komponenten, die es mitbringt. Bei Spring haben wir das Glück, dass es ganz viele Komponenten mitbringt. Jede Anwendung ist unterschiedlich und hat andere Anforderungen, prinzipiell ist es immer von Vorteil, wenn es eine Lösung für ein Problem gibt, die "im Hause" gelöst wurde. So müssen wir uns als Entwickler keine Gedanken über Kompatibilitätsprobleme machen, sondern können uns auf unsere eigentliche Aufgabe konzentrieren.

Das Spring Ökosystem

Durch Spring Data werden uns Zugriffe zu den verschiedensten Datenbanken erleichtert, sei es relationale, objekt- oder dokumentenbasierte Datenbanken oder Services wie Elasticsearch. Teil von Spring Data ist Spring Data JPA, wodurch wir JPA basierte Repositories entwickeln können. Wir schreiben das Interface und Spring kümmert sich um die Implementierung.

Mit Spring Security haben wir ein Authentifizierungs- und Autorisierungs-Framework, mit welchen wir all unseren Sicherheitsbedürfnissen gerecht werden können. Mechanismen für den Schutz von Webanwendungen, Einbau von Filtern für Rollenzugriffe, oder die Bereitstellung eines Servers für die Implementierung von OAuth oder OpenID Connect.

Und das sind nur ein paar Auszüge aus den vielen Projekten, die im Spring Ökosystem vorhanden sind. Und dann gibt es on-top dazu noch Pakete, die durch die Community gewartet und entwickelt werden - und dann gibt es noch das generelle Java Ökosystem, was auch schon riesig ist.

Was sind die Vor- und Nachteile?

Was kann ich mit Spring alles machen?

Was kann ich mit Spring nicht machen?

Fazit