© Enkel/Shutterstock.com
Spring Data Neumann: Neuerungen im Überblick

Alles neu macht(e) der Mai


Seit dem letzten Spring-Data-Release sind rund sechs Monate vergangen – und schon steht das neue Release „Neumann“ bereit, benannt nach Klara Dan von Neumann. Grund genug, uns die Neuerungen genauer anzuschauen.

Das Spring Data Project kehrt mit dem aktuellen Release zu einem sechsmonatigen Releasezyklus zurück. Die vorangehenden Releases (Lovelace, Moore) wurden zuletzt in einem Abstand von neun bis zwölf Monaten aktualisiert. Diese Zeitspanne hatte sich als zu lang erwiesen, da etliche Treiberaktualisierungen aufgrund der Dependency-Upgrade-Richtlinie nicht berücksichtigt werden konnten. Abhängigkeiten können nach einem GA-Release nur noch auf Service-Releases aktualisiert werden – Major- oder Minor-Releases können daher nur im nächsten Release-Train berücksichtigt werden. Ab diesem Release verfolgt das Spring-Data-Team den Plan, alle sechs Monate einen GA-Release zu veröffentlichen. Diesem Zyklus passt sich das Spring-Boot-Projekt ebenfalls an.

Dieser Release-Train steht ganz im Fokus von großen Änderungen und den nächsten Treibergenerationen. Ganz konkret geht es um folgende Upgrades:

  • Spring Data für Apache Cassandra 3.0 (vorher: 2.2)

  • Spring Data Couchbase 4.0 (vorher: 3.2)

  • Spring Data Elasticsearch 4.0 (vorher: 3.2)

  • Spring Data JDBC 2.0 (vorher: 1.1)

  • Spring Data MongoDB 3.0 (vorher: 2.2)

Kurz und kompakt bedeutet das:

Cassandra: Das längst überfällige Upgrade auf den Cassandra-Treiber von Version 2.7 auf Version 3.0 bringt zahlreiche Änderungen im Konfigurations-API mit sich. Einige API-Änderungen ziehen sich bis zu Lifecycle Events, Entity Callbacks und ins CqlTemplate. Darüber hinaus wurden deprecated APIs entfernt.

Couchbase: Upgrade auf das Couchbase SDK von Version 3.6 auf Version 4.6. Auch hier gibt es etliche Änderungen, die sich auf die Konfiguration auswirken. Das neue SDK bringt native Unterstützung für Reactive Streams mit sich.

Elasticsearch: Das Elasticsearch-Modul wurde von Elasticearch-Version 6.8 auf 7.6 aktualisiert. In diesem Zug wurden das Template-API sowie der Mappingkern komplett überarbeitet. Spring Data Elasticsearch sieht damit nicht nur so aus wie ein Spring-Data-Modul, sondern fühlt sich auch so an. Vielen Dank an die Community, die diese Aufgabe auf sich genommen hat!

JDBC: Etliche Interna des JDBC-Moduls wurden für API-Stabilität und gleichzeitige -Erweiterbarkeit umgeschrieben. Was sich erstmal gegensätzlich anhört, passt dennoch zueinander. An vielen Stellen wurden neue Interfaces eingeführt, um die eigentlichen Implementierungsklassen zu verstecken. Query Derivation hat Einzug gehalten und die gemeinsame Basis, Spring Data Relational, für gemeinsame Funktionalität zwischen Spring Data JDBC und Spring Data R2DBC erweitert.

MongoDB: Das MongoDB-Treiberupgrade von Version 3.10 auf Version 4.0 bringt eine Änderung im Treiber-Packaging. Der synchrone Treiber ist nun optional und wird nicht länger benötigt, wenn MongoDB mit dem reaktiven Treiber angebunden ist. Diese Änderungen wirken sich primär auf das Dependency-Set-up sowie das Konfigurations-API aus.

Neben den Upgrades gibt es eine Reihe weiterer Kernthemen:

  • Unterstützung von Kotlin Coroutine Repositories

  • Verbesserungen für Immutable Types in Vorbereitung auf Java 14 Records

  • Upgrade auf Querydsl 4.3

  • Generalrevision des Spring Data Elasticsearch API

  • Embeddables für Spring Data Cassandra

  • Zusammenführung der Module GemFire und Geode im Spring-Data-for-Apache-Geode-Modul

  • Revision des Spring-Data-JDBC-Moduls

  • Integration von Spring Data R2DBC (Reactive Relational Database Connectivity) in den Release-Train; Erweiterung um Query Derivation und Statement Filter API

  • Überführung des Apache-Solr-Moduls in ein Communityprojekt

  • Deprecation der Unterstützung für Joda Time und ThreeTenBackport

Neben den Kernthemen hat noch eine ganze Reihe weiterer Änderungen in die einzelnen Module Einzug gehalten. Im weiteren Verlauf betrachten wir die einzelnen Module genauer.

Spring Data Commons

Das Commons-Modul stellt Basisfunktionalität für alle anderen Spring-Data-Module bereit. Oftmals können hier Funktionalitäten für alle Spring-Data-Module bereitgestellt werden, ohne dass die einzelnen Module verändert werden müssen. So auch für Kotlin Coroutine Repositories. Kotlin Coroutines ist ein Ansatz in Kotlin, um Parallelisierung bereitzustellen, während der Code in einem imperativen Look and Feel bleibt. Überall wo Spring ein reaktives API bereitstellt, lassen sich Coroutines besonders einfach integrieren. Die Brücke zu Coroutines bedarf nur einer minimalen Kotlin-Erweiterung („Kotlin Extensions“) für ein bestehendes reaktives API.

Somit sind Kotlin Coroutine Repositories mit Spring Data Neumann überall dort möglich, wo es bereits reaktive Spring-Data-Repository-Unterstützung gibt:

  • Spring Data Cassandra

  • Spring Data Couchbase

  • Spring Data Elasticsearch

  • Spring Data MongoDB

  • Spring Data R2DBC

interface MyCoroutineRepository : CoroutineCrudRepository<User, String> { suspend fun findByFirstnameAndLastname(firstname: String, lastname: String): User fun findByLastname(id: String): Flow<User> }

Kotlin ist mit einer der Treiber für Immutable Value Objects, da in Kotlin standardmäßig Konstruktor-Properties final sind. So hat Spring Data bereits im vorhergehenden Release-Train (Moore) die Unterstützung für Immutable Types deutlich ausgebaut. Mit diesem Release-Train wurde nochmals nachgelegt, insbesondere mit Blick auf pure Java-Value-Objekte und die anstehenden Java 14 Record Types.

Records sind ein Preview Feature des kürzlich erschienenen Java 14, die es sehr komfortabel erlauben, Value-Objekte zu deklarieren. Ein Aspekt der Records ist es, dass ein Record nach der Instanziierung nicht mehr verändert werden kann. Damit eignen sich diese Typen als Zieltypen für Datentransferobjekte und Projektionen. Die Integration mit Record Types in Spring ist noch nicht vollständig, da für Record Types noch keine Bean-Property-Deskriptoren erzeugt werden. Das wird sich frühestens mit Spring Framework 5.3 oder Java 15 ändern, abhängig davon, wo die Unterstützung für Bean-Property-Deskriptoren zuerst hinzugefügt wird. Spring Data bietet derweil die Möglichkeit, Mutationen auf Basis vollständig unveränderlicher Typen durchzuführen, indem pro Mutation eine neue Objektinstanz erzeugt wird. Dieses Feature kann seit Neumann benutzt werden, sofern das Value-Objekt im Code vollständig immutable ist. Project Lombok’s @Value bietet hierzu ebenfalls Unterstützung (Listing 1).

Listing 1

class ImmutableUser { private final String firstname, lastname; private final int age; public Sample(String firstname, String lastname, int age) { this.firstname = firstname; this.lastname = lastname; this.age = age; } public String getFirstname() { return this.firstname; } public String getLastname() { return this.lastname; } public int getAge() { return this.age; } } @Value class LombokUser { String firstname, lastname; int age; }

Seit Java 8 besteht keine Notwendigkeit mehr für Joda-Time, um ein komfortables Date/Time API nutzen zu können. Daher hat sich das Spring-Team entschieden, die Unterstützung für Joda-Time und ThreeTenBackport (Java-6-kompatible Variante des JSR-310 API) schrittweise zurückzubauen. Spring Boot 2.2 hatte bereits Deprecations angekündigt. Mit Spring Boot 2.3 wurde die Unterstützung für Joda-Time inkl. Dependency Management entfernt. Spring Data Neumann zieht nach, indem die Konverter, die zwischen Joda-Time/ThreeTenBackport und JSR-310 bzw. jav...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang