Mehr Details unter https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes
Und in ein paar Monaten im Buch https://www.rheinwerk-verlag.de/spring-boot-3-und-spring-framework-6/
Mehr Details unter https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes
Und in ein paar Monaten im Buch https://www.rheinwerk-verlag.de/spring-boot-3-und-spring-framework-6/
Jürgen Höller kündigt die neue Version Spring Framework 6 an:
Liebe Spring-Gemeinde,
ich freue mich, Ihnen mitteilen zu können, dass Spring Framework 6.0.0 ab sofort allgemein über Maven Central verfügbar ist! Dies ist der Beginn einer neuen Framework-Generation für das Jahr 2023 und darüber hinaus, die aktuelle und kommende Innovationen in OpenJDK und dem Java-Ökosystem einbezieht. Gleichzeitig haben wir es sorgfältig als unkompliziertes Upgrade von Spring Framework 5.3.x für moderne Laufzeitumgebungen konzipiert.
Als große Überarbeitung des Kern-Frameworks verfügt Spring Framework 6.0 über eine Java 17+-Baseline und einen Wechsel zu Jakarta EE 9+ (im jakarta-Namensraum), wobei der Schwerpunkt auf den kürzlich veröffentlichten Jakarta EE 10-APIs wie Servlet 6.0 und JPA 3.1 liegt. Dies ermöglicht den Zugriff auf die neuesten Webcontainer wie Tomcat 10.1 und die neuesten Persistenzanbieter wie Hibernate ORM 6.1. Bleiben Sie nicht bei Java EE 8 hängen, sondern machen Sie den Sprung zum jakarta-Namensraum, idealerweise direkt auf die Ebene von Jakarta EE 10! Das kommende Spring Boot 3.0.0 Release enthält entsprechende verwaltete Abhängigkeiten für Sie.
Was die Infrastruktur betrifft, so führt 6.0 eine Grundlage für Ahead-Of-Time-Transformationen und die entsprechende AOT-Verarbeitungsunterstützung für Spring-Anwendungskontexte ein. Dies ermöglicht eine erstklassige Unterstützung für native GraalVM-Images mit Spring Boot 3. Sie können auch die virtuellen Threads von Project Loom mit Spring-Anwendungen erforschen und in den Checkpoint-Restore-Ansatz von Project CRaC für schnellere JVM-Starts eintauchen, die beide derzeit noch in der Vorschau sind, aber voraussichtlich zu erstklassigen Features für Spring Framework 6.x-basierte Anwendungen werden.
In Spring Framework 6.0 sind viele weitere Funktionen und Verbesserungen verfügbar, z.B. ein HTTP-Schnittstellen-Client, Unterstützung für RFC 7807-Problemdetails und Micrometer-basierte Beobachtbarkeit für HTTP-Clients. Bitte besuchen Sie unsere Seite What’s New für einen umfassenden Überblick und probieren Sie 6.0.0 frühzeitig aus!
Neu: https://mas.to/@ullenboom
Details unter https://spring.io/blog/2022/10/20/spring-boot-3-0-0-rc1-available-now,
Mein Spring-Boot-Buch entwickelt sich gut, es gibt keine großen Showstopper. Hibernate 6 ergibt bei einer @ManyToMany Assoziation eine komischer Ausnahme, das was bei Hibernate 5 nicht so war; zum Glück, wenn man von EAGER auf LAZY geht (ist eh Standard), ist das kein Problem mehr.
Kleine Änderungen gegenüber SB 2 betreffen @AutoConfiguration bei eigenen Autokonfigurationen, aber im Allgemeinen ist der Aufwand für eine SB 3-Migration gering, da SB 2.7 verschiedene Sachen vorbereitet hat, etwa spring.factories fällt weg oder der WebSecurityConfigurerAdapter.
Der https://github.com/spring-projects-experimental/spring-boot-migrator kann automatisch migrieren.
Meine aktuellen Spring-Kurse basieren auf SB 2, im nächsten Jahr werde ich diese zu einem großen Kurs zusammenfassen, der dann auf SB 3 basiert.
Siehe https://spring.io/blog/2022/05/19/spring-boot-2-7-0-available-now
Interessant finde ich den Ort der Auto-Konfiguration, der jetzt nicht mehr spring.factories ist, sondern META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. Und bei Spring Security, dass der https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurerAdapter.html deprecated ist.
Alle andere Neuerungen unter https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.7-Release-Notes
Nach Spring Boot 2.7 wird es mit Spring Boot 3 weitergehen, Spring Boot 2.8 ist nicht geplant. https://spring.io/projects/spring-boot#support
Die nächsten Tage werde ich meine Spring Kurs https://www.udemy.com/course/dependency-injection-spring-boot-spring-framework/?referralCode=935D6CF5782896E9674B aktualisieren.
Übersicht unter https://spring.io/blog/2021/11/19/spring-boot-2-6-is-now-available und noch detaillierter unter Spring Boot 2.6 Release Notes · spring-projects/spring-boot Wiki · GitHub.
Quelle: https://www.slideshare.net/Pivotal/building-layers-of-defense-for-your-application?next_slideshow=1
Details siehe https://github.com/spring-projects/spring-boot/releases/tag/v2.4.1
Details siehe https://spring.io/blog/2020/09/16/spring-tools-4-8-0-released. Kurz zusammengefasst:
Download der Spring Tools 4: https://spring.io/tools/
Ankündigung im Blog https://spring.io/blog/2019/09/30/spring-framework-5-2-goes-ga:
Spring Framework 5.2 requires JDK 8 or higher and specifically supports JDK 11 as the current long-term support branch as well as JDK 13 as the latest OpenJDK release. It comes with many performance improvements (affecting startup time as well as peak performance) and further steps taken towards GraalVM native image support.
This release deeply integrates with Kotlin 1.3 and provides first-class support for Kotlin coroutines on top of Spring WebFlux. Furthermore, it comes with reactive messaging integration for the RSocket protocol as well as reactive transaction management for R2DBC, MongoDB and Neo4j (with datastore integration provided by Spring Data’s modules).
As of the upcoming Spring Boot 2.2 RC1 release, you’ll be able to consume Spring Framework 5.2 GA through start.spring.io!
Wichtige Links:
Details siehe https://github.com/spring-projects/spring-boot/releases/tag/v2.1.4.RELEASE
Auch Spring Boot 2.2 kommt einen Schritt weiter richtig GA.
Details siehe https://spring.io/blog/2019/01/25/spring-tools-4-1-1-released
Zitat:
Highlights from this release include:
Das Actuator-Modul von Spring Boot stellt HTTP-Endpunkte bereit, die Auskunft über den Zustand der Anwendung geben und es erlauben, die Anwendung zu beeinflussen.
Eigene Informationen über den „Gesundheitzustand“ lassen sich einbauen.
Die Informationen werden über REST veröffentlicht, können aber auch über JMX abgerufen werden.
Achtung: Actuator 1 und Actuator 2 unterscheiden sich deutlich!
Einbinden wie üblich über die POM:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Da ganze funktioniert nur im Web-Modus, also muss org.springframework.boot:spring-boot-starter-web
auch in der POM-Datei sein.
Starte man nun die Anwendung, kann man im Log die neuen Endpunkte sehen.
Damit ein Actuator Endpunkt über HTPP verfügbar ist, muss er enabled und exposed sein.
Um mehr Endpunkte freizuschalten setze man die die application.properties:
management.endpoints.web.exposure.include=*
Der Wildcard *
aktiviert alle, alternativ zählt man kommasepariert auf.
Welche Endpunkte es gibt dokumentiert https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html.
Die Endpunkte liegen alle eine Ebene unter http://localhost:8080/actuator:
Zum Beispiel: http://localhost:8080/actuator/health.
Die genaue JSON-Struktur erklärt https://docs.spring.io/spring-boot/docs/current/actuator-api/html/.
Natürlich lassen sich Dinge wie
konfigurieren.
Siehe dazu die Referenz-Dokumentation https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-monitoring.html
Unter /health finden sich Informationen über den „Gesundheitszustand“ der Anwendung.
Der Status kann UP
oder DOWN
sein. Standardmäßig gibt es nur status
Bei einer nicht-authentifizierten Verbindung bekommt man nicht mehr zu sehen als den Status.
Um das zu ändern, müssen wir 1. in die POM mit aufnehmen:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Dann 2. in application.properties (zum Testen!):
management.endpoint.health.show-details=always spring.security.user.name=user spring.security.user.password=pass
Nach dem Neustart der Anwendung und Neuladen der Webseite erfolgt eine BASIC-Authentifizierung. Geben wir user
/pass
ein, sehen wir alles.
Siehe https://spring.io/blog/2018/04/16/spring-tool-suite-3-9-4-released und https://docs.spring.io/sts/nan/v394/NewAndNoteworthy.html
Basiert nun auf Eclipse Oxygen.3a, womit Java 10 möglich wird.
Spring Retry ist ein Zusatzprojekt (https://github.com/spring-projects/spring-retry), um Codeblöcke wiederholt auszuführen, wenn sie zu einem Fehler führen.
Als erstes müssen zwei Dependencies in unsere POM:
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
Schreiben wir eine Bean, die zwei Anläufe braucht, eine Operation durchzuführen.
@Component
class Achiever {
int tries = 1;
@Retryable
public int tryIt() {
System.out.println( "Runde " + tries );
tries++;
if ( tries != 3 )
throw new IllegalStateException( "Runde nicht 3" );
return tries;
}
}
Retryable drückt aus, das eine Operation bei Ausnahmen automatisch neu aufgerufen werden soll. |
|
Die Methoden können eine Rückgabe haben, oder auch keine. |
Damit Spring für die annotierten Methoden einen Proxy baut, müssen wir eine @Configuration
mit @EnableRetry
annotieren.
Wir können nun den Achiever
injizieren:
@Autowired Achiever archiever;
Und die Methode ausführen:
System.out.println( "Vor dem Aufruf" );
int i = archiever.tryIt();
System.out.println( "Nach dem Aufruf ist i=" + i );
Auf der Konsole erscheint keine Exception. Nur:
Vor dem Aufruf Runde 1 Runde 2 Nach dem Aufruf
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Retryable {
String interceptor() default "";
Class<? extends Throwable>[] value() default {};
Class<? extends Throwable>[] include() default {};
Class<? extends Throwable>[] exclude() default {};
String label() default "";
boolean stateful() default false;
int maxAttempts() default 3;
String maxAttemptsExpression() default "";
Backoff backoff() default @Backoff();
String exceptionExpression() default "";
}
Die Anzahl der Wiederholungen ist nicht unendlich, Spring stoppt standardmäßig bei 3. |
Die Dokumentation unter https://github.com/spring-projects/spring-retry zeit weitere Möglichkeiten auf. Ein zusätzliches Beispiel:
@Retryable
public void tryIO() throws IOException {
throw new IOException( LocalTime.now().toString() );
}
@Recover
public void recover( IOException e ) {
System.err.println( "Aarrrrg: " + e );
}
Die mit @Recover annotierte Methode wird am Ende einer nicht erfolgreichen Aufrufkette aufgerufen. |
Bei Methoden, die idempotent sind, also zu einem Parameter immer den gleichen Wert liefern, kann Spring einen Cache zur Optimierung einsetzen.
Beispiele:
Achtung: Gewisse Cache-Inhalte können nach einer Zeit ungültig werden.
Um das Caching zu aktivieren annotiert man
@Configuration
mit @EnableCaching
public
(!!!) Methode mit @Cacheable
und vergibt einen Cache-Namen.@Component
class Hash {
@Cacheable( "md5" )
public byte[] md5( String text ) {
System.out.println( "hash: " + text );
try {
MessageDigest md = MessageDigest.getInstance( "MD5" );
return md.digest( text.getBytes( StandardCharsets.UTF_8 ) );
}
catch ( NoSuchAlgorithmException e ) {
throw new IllegalStateException( e );
}
}
}
Wir können Hash
injizieren
@Autowired
Hash hash;
und nutzen
byte[] md5_1 = hash.md5( "tutego" );
byte[] md5_2 = hash.md5( "tutego" );
System.out.println( Arrays.equals( md5_1, md5_2 ) ); // true
System.out.println( hash.getClass() ); // com.tutego.boot.basic.Hash$$EnhancerBySpringCGLIB$$4548965
KeyGenerator
en verwenden.@Cacheable(cacheNames="books", key="#isbn.rawNumber")
.@Cacheable(cacheNames="book", condition="#name.length() < 32")
@CachePut
annotiert, kann man den Cache selbst füllen, bzw. Werte überschreiben.@CacheEvict
annotiert, etwa @CacheEvict(cacheNames="books", allEntries=true) public void clear()
wird der Cache gelöscht.Das Spring Framework kann automatisch diverse Caching-Implementierung nutzen.
ConcurrentHashMap
.In der application.[properties|yml] lassen sich dann Dinge wie Lebensdauer, Größe, etc. extern konfigurieren.
Spring nutzt drei Annotationen, um Managed Beans mit ihren Zuständen und Operationen beim JMX Agent zu registrieren:
@ManagedResource
@ManagedAttribute
@ManagedOperation
package com.tutego.boot.actuator;
import java.util.HashMap;
import java.util.Map;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.stereotype.Component;
@Component
@ManagedResource
public class StringMapManagedBean {
private final Map<String, String> map = new HashMap<>();
@ManagedAttribute
public int getSize() {
return map.size();
}
@ManagedOperation
public String get( String key ) {
return map.get( key );
}
@ManagedOperation
public String put( String key, String value ) {
return map.put( key, value );
}
public void remove( String key ) {
map.remove( key );
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface ManagedResource {
@AliasFor("objectName")
String value() default "";
@AliasFor("value")
String objectName() default "";
String description() default "";
int currencyTimeLimit() default -1;
boolean log() default false;
String logFile() default "";
String persistPolicy() default "";
int persistPeriod() default -1;
String persistName() default "";
String persistLocation() default "";
}
Spring Boot veröffentlicht selbst diverse Managed Beans unter der Domäne org.springframework.boot
.
org.springframework.boot:type=Endpoint,name=Health
zum Beispiel für die GesundheitsinformationenSie lassen sich abschalten mit management.endpoints.jmx.exposure.exclude=*
.
Falls mehrere ApplicationContext
exisistieren kommt es zum Namenskonflikt; der lässt sich mit management.endpoints.jmx.unique-names=true
vermeiden.
Der Domain-Name lässt sich anpassen mit management.endpoints.jmx.domain
.
Ankündigung und Neues unter https://spring.io/blog/2017/09/28/spring-framework-5-0-goes-ga
Features wie auf http://www.springsource.org/node/3334 genannt: