Novedades de Spring 6
El futuro de Spring
Spring ha cambiado de versión principal a principios de año. Tenemos Spring 6 y Spring Boot 3.
Esta versión requiere JDK 17 y funciona con Jakarta EE 9.
Las principales novedades que detallaremos son la compilación nativa Spring Native, el soporte para módulos Java y la observación. Se ha producido una gran limpieza en las funcionalidades obsoletas. Para facilitar la transición, JDK 17 y Jakarka EE 9+ son compatibles con Spring 5.3.x.
La última versión actualmente disponible es 6.0.0-M3 de 17/03/22.spring-framework-6.0.x-stage-milestone-3.1. El resumen de los cambios que hay que realizar en el código para la migración a la versión 6 se indica en esta página: https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x
Soporte de módulos Java
Podremos utilizar JPMS (Java Platform Module System). Tendremos descriptores de módulos para todos los módulos de Spring. Los módulos han existido desde JDK 9. Se trata de un nuevo nivel de abstracción por encima de los paquetes. Teóricamente, tenemos una nueva abstracción package of Java Packages que permite que el código sea aún más reutilizable.
La adopción del módulo se ha retrasado principalmente debido a los paquetes Maven y de Spring. Las evoluciones se hicieron en Maven (y Gradle), por lo que Spring tuvo que formar parte de este movimiento. Eso se ha hecho.
De hecho, por defecto, no podemos usar la reflexión en clases que importamos de otro módulo, aunque Spring y JUnit utilicen la reflexión de manera masiva.
Con la modularización, tenemos una dependencia tanto durante la ejecución como en el momento de la compilación. Pero Spring nos abstrae de las dependencias en la compilación con el sistema discovery y de configuración automática, que es un enfoque completamente diferente.
Los módulos permiten ocultar ciertas cosas, potenciar el secreto, mientras que Spring está ahí para exponer y reutilizar. Java también suele evolucionar sin tener en cuenta a las personas, las herramientas o quiénes las utilizan, lo que impide o va en contra de ciertos usos, mientras...
Spring Native
Desde hace algún tiempo, las empresas han estado migrando al cloud. Los clouds recientes se basan en Docker y Kubernetes. En estas arquitecturas, lo caro es la huella de memoria y el tiempo de lanzamiento de los nodos. Hay soluciones que han comenzado a surgir en este ecosistema, basadas en GraalVM. GraalVM logra competir con los servidores Node.js, especialmente a nivel de los servidores de funciones que escalan a 0.
Spring ha colaborado desde el principio con Sun y después con Oracle en el uso de GraalVM y ahora ofrece su integración. Tenemos las ventajas de Quarkus o Micronaut, pero en el ecosistema de Spring. La solución ya está disponible con Spring Boot 2, pero no todos los módulos son compatibles en este momento.
Proyecto Leyden
Podemos tener la incorporación del proyecto Leyden (The java static graph project). Mark Reinhold, arquitecto del lenguaje Java, propuso mejorar las aplicaciones binarias estáticas para lograr un inicio más rápido y un menor uso de memoria. Esto permitirá compilar código Java (just-in-time) y obtener aplicaciones nativas (ahead-of-time) con capacidades similares al modo nativo de GraalVM. Se trata de la compilación AOT estática.
Spring Observability
Este módulo se basa en Micrometer para las métricas y estará disponible para aplicaciones nativas.
Obsolescencia programada
Es posible que algunas características ya no sean compatibles:
-
Autowiring en los setters por nombre/tipo.
-
Simplificación del FactoryBean.
-
Soporte de los EJB, JCA y de JAX-WS.
-
Configuración de las aplicaciones Spring a través de la configuración XML.
-
Capacidad para realizar llamadas RPC.