SpringBoot 2.1 Changelog

Hier zeige ich kurz die wichtigsten Änderungen in SpringBoot 2.1 auf. Aktuell ist der 3. Milestone erreicht.

SpringBoot 2.1 M1

Features

  • Reaktive Health Indikator für Cassandra
  • JUnit 5 @ExtendWith(SpringExtension.class) kann entfallen

Die Annotation @ExtendWith(SpringExtension.class) wird in den @…Test Annotationen annotiert, so dass diese nicht expliziet angegeben werden muss.

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class SampleJunitJupiterApplicationTests {

Wird zu…

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class SampleJunitJupiterApplicationTests {
  • Logback unterstützt nun ProfileExpression
  • JPA 2.2 wird erreicht (Streaming von ResultSets ist nun möglich)
  • Hibernate Metrics werden in Actuator zur Verfügung gestellt

Konfiguration:

spring.jpa.properties.hibernate.generate_statistics=true
  • Support für Undertow 2.0 und Tomcat 9

  • Wenn DevTools im Klassenpfad, dann wird bei Fehlern ein Stacktrace per Default ausgegeben.

Konfiguration:

server.error.include-stacktrace=ALWAYS

Mit dem Update auf Hibernate 5.3.0 Final und Java Persistant Api 2.2 sind das Streamen von ResultsSets möglich.

SpringBoot 2.1 M2

Features

  • Es wird verhindert das der MySQL Connector eine alte Version von Protobuf-java als Abhängigkeit einbringt
  • Support Java 11

Mit dem Update auf Assertj 3.11 wird Java 11 unterstützt.

  • Spring Data JPA Bootstrap Mode kann konfiguriert werden

Es gibt neben DEFAULT zwei neue Initialisierungsarten LAZY und DEFERRED. Mit Lazy und Deferred lassen sich die Startupzeiten der Application zum Teil drastisch reduzieren. Siehe Deferred Example.

Der Unterschied zwischen Lazy und Deferred ist, dass bei Deferred die Validierung vor der ersten Nutzung der Anwendung durchgeführt wird. D.h. nach dem ApplicationContext zur Verfügung steht. Bei Lazy geschied dies erst dann, wenn auf ein Repository das erste Mal zugegriffen wird.

Gerade im Bezug auf kurze TurnAround-Zeiten bei der Entwicklung ist dieses von Vorteil. Ist DEFERRED default, wenn DevTools eingebunden werden?

  • Es gibt einen neuen Starter für OpenID Connect/OAuth2 spring-boot-starter-oauth2-oidc-client

  • Feintuning und Review im Logging

  • FormContentFilter ersetzt HttpPutFormContentFilter

Dependencies

Unter anderem wurde folgende Anhägigkeiten erneuert:

  • Lombok 1.18.2
  • Influxdb Java 2.12
  • Mysql 8.0.12
  • Hazelcast 3.10.4

SpringBoot 2.1 M3

Features

  • Minimale Version von Gradle wurde auf Version 4.4 angehoben
  • Verzögerte Ausgabe der DevTools Loggingeinträge

Mit defer devtools logging kann die Ausgabe der Loggingeinträge bis nach der Ausgabe des SpringBoot Logos verzögert werden.

  • Unterstützung von Logging Gruppen

Logger können jetzt zu Gruppen zusammengefasst werden. Somit kann einer Gruppe ein Level zugewiesen werden.

# define group
logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
# set level
logging.level.tomcat=TRACE
  • Es kann der BackgroundPreinitializer abgeschaltet werden

In bestimmten Umgebungen wo nur eine CPU zur Verfügung steht, macht es keinen Sinn die Initialisierung in den Hintergrund in einem extra Thread zu verlagern. Dieses kostet nur extra CPU Zeit wg. Kontextwechsel.

Beispiel: spring.backgroundpreinitializer.ignore=true # Whether background preinitializer should be ignored.

  • JAXB wurde als Abhängigkeit hinzugefügt

Mit Java 10 wurde JAXB als deprecated markiert und mit Java 11 ganz entfernt. Da Java 11 eine LTS Version ist, wurde kurzum JAXB als Abhängigkeit hinzugefügt. Das vermindert auch wieder die Abhängigkeiten in Maven oder Gradle Buildskripten.

  • Fehler in der JSON Konfiguration werden jetzt mit einer Exception quittiert

Da nur das Ausgeben von warnings in den Logger zu unvorhersehbaren Verhalten führt, wurde jetzt das Verhalten geändert und eine JsonParseException geworfen.

  • Der Parameter max HTTP header size ist jetzt für alle unterstützten Container gleich

  • Es wird eine Warnung geloggt, wenn die Application als Root läuft

Mit runUser kann dem Startskript mitgeteilt werden unter welchem Benutzer das Programm gestartet werden soll. Ist das Argument runUser nicht angegeben, so wird das Programm unter der ID des Benutzers dem das Skript gehört ausgeführt. Gehört das Skript z.B. Root (UID = 0), dann wird dieses jetzt mitgeloggt.

  • Der Object Mapper Jackson wird jetzt als Singleton instanziert

Durch die diese Optimierung werden neue Instanzen des JacksonJsonParser schneller erstellt.

Dependencies

Unter anderem wurde folgende Anhägigkeiten erneuert: