Spring Boot 4 vs 3: Todo lo que Cambió y Cómo Migrar tu Proyecto
Spring Boot 4: La Evolución que Java Necesitaba
En noviembre de 2025, el equipo de Spring lanzó Spring Boot 4.0 junto con Spring Framework 7, marcando uno de los saltos más significativos en la historia del ecosistema Spring. Si vienes de Spring Boot 3.x, este artículo te explica todos los cambios, las mejoras de rendimiento y cómo migrar tu proyecto sin dolor.

Requisitos del Sistema
Antes de migrar, es fundamental conocer los nuevos requisitos base:
| Requisito | Spring Boot 3.x | Spring Boot 4.0 |
|---|---|---|
| Java mínimo | Java 17 | Java 17 (recomendado 25) |
| Spring Framework | 6.x | 7.0 |
| Jakarta EE | 9 (Servlet 6.0) | 11 (Servlet 6.1) |
| Kotlin | 1.9+ | 2.2+ |
| GraalVM | 22+ | 25 |
Modularización: Adiós al JAR Monolítico
Uno de los cambios más profundos en Spring Boot 4 es la modularización completa del codebase. El antiguo JAR monolítico spring-boot-autoconfigure se ha dividido en módulos pequeños y enfocados.
¿Qué significa esto para ti?
- JARs más pequeños — solo incluyes lo que tu aplicación necesita
- Arranque más rápido — menos clases que escanear al iniciar
- Menor huella de memoria — hasta 40% menos de consumo de RAM
- Mejor mantenibilidad — módulos claros y desacoplados
1<!-- Spring Boot 3: un solo starter lo traía TODO -->
2<dependency>
3 <groupId>org.springframework.boot</groupId>
4 <artifactId>spring-boot-starter-web</artifactId>
5</dependency>
6
7<!-- Spring Boot 4: starters modulares más granulares -->
8<dependency>
9 <groupId>org.springframework.boot</groupId>
10 <artifactId>spring-boot-starter-web</artifactId>
11</dependency>
12<!-- Los Classic Starter POMs siguen funcionando para compatibilidad -->
13<!-- Pero ahora puedes importar módulos individuales si prefieres -->
pom.xml actual debería compilar sin cambios. La modularización es opt-in para quienes quieran optimizar.
API Versioning: Versionado Nativo de APIs REST
Esto es una de las funcionalidades más esperadas. Spring Boot 4 incluye versionado nativo de APIs REST sin necesidad de librerías externas. Soporta múltiples estrategias:
- Versionado por path (
/api/v1/users) - Versionado por header (
X-API-Version: 2) - Versionado por query parameter (
?version=1.1) - Versionado por media type (
Accept: application/vnd.api.v2+json)
1@RestController
2@RequestMapping("/api/accounts")
3public class AccountController {
4
5 // Versión 1.0 — respuesta básica
6 @GetMapping(url = "/{id}", version = "1.0")
7 public AccountV1 getAccountV1(@PathVariable Long id) {
8 Account account = accountService.findById(id);
9 return new AccountV1(account.getId(), account.getName());
10 }
11
12 // Versión 2.0 — respuesta enriquecida con balance y metadata
13 @GetMapping(url = "/{id}", version = "2.0")
14 public AccountV2 getAccountV2(@PathVariable Long id) {
15 Account account = accountService.findById(id);
16 return new AccountV2(
17 account.getId(),
18 account.getName(),
19 account.getBalance(),
20 account.getMetadata()
21 );
22 }
23}
La configuración se hace a través de ApiVersionStrategy:
1@Configuration
2public class ApiVersionConfig implements WebMvcConfigurer {
3
4 @Override
5 public void configureApiVersioning(ApiVersionConfigurer configurer) {
6 configurer
7 .usePathPrefix("/api/v{version}") // Estrategia por path
8 .defaultVersion("1.0")
9 .reportDeprecated(true); // Avisa si usas versión deprecada
10 }
11}
Virtual Threads: Escalabilidad Sin Código Reactivo
Spring Boot 3.2 introdujo soporte experimental para virtual threads. En Spring Boot 4, son ciudadanos de primera clase. Esto cambia radicalmente cómo escalar aplicaciones Java.
![]()
1# application.yml — habilitar virtual threads
2spring:
3 threads:
4 virtual:
5 enabled: true
Con una sola línea de configuración, todas las peticiones HTTP se procesan en virtual threads. Ya no necesitas WebFlux ni código reactivo para escalar:
1@RestController
2@RequestMapping("/api/orders")
3public class OrderController {
4
5 private final OrderRepository orderRepository;
6 private final PaymentService paymentService;
7 private final NotificationService notificationService;
8
9 // Este endpoint BLOQUEA — pero con virtual threads, no importa.
10 // Cada request usa un virtual thread que apenas consume memoria.
11 @GetMapping("/{id}")
12 public OrderDetails getOrder(@PathVariable Long id) {
13 // Llamada bloqueante a DB — OK con virtual threads
14 Order order = orderRepository.findById(id).orElseThrow();
15
16 // Llamada bloqueante a servicio externo — OK con virtual threads
17 PaymentInfo payment = paymentService.getPayment(order.getPaymentId());
18
19 return new OrderDetails(order, payment);
20 }
21}
Structured Concurrency: Paralelismo Limpio
Java 21+ introdujo Structured Concurrency, y Spring Boot 4 lo abraza completamente. Permite ejecutar tareas en paralelo con manejo de errores limpio y cancelación automática:
1@Service
2public class UserProfileService {
3
4 private final UserService userService;
5 private final OrderService orderService;
6 private final RecommendationService recommendationService;
7
8 public UserProfile buildProfile(Long userId) throws Exception {
9 try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
10 // Las 3 llamadas se ejecutan en paralelo, cada una en un virtual thread
11 var userTask = scope.fork(() -> userService.getUser(userId));
12 var ordersTask = scope.fork(() -> orderService.getOrdersForUser(userId));
13 var recsTask = scope.fork(() -> recommendationService.getForUser(userId));
14
15 scope.join(); // Espera a que todas terminen
16 scope.throwIfFailed(); // Si alguna falló, propaga la excepción
17
18 return new UserProfile(
19 userTask.get(),
20 ordersTask.get(),
21 recsTask.get()
22 );
23 }
24 // Si una falla, las demás se cancelan automáticamente
25 }
26}
Null Safety con JSpecify
Spring Boot 4 adopta JSpecify como estándar para null safety en toda la API. Esto significa que tu IDE y herramientas de análisis estático pueden detectar problemas de nullabilidad en tiempo de compilación:
1import org.jspecify.annotations.NonNull;
2import org.jspecify.annotations.Nullable;
3
4@Service
5public class UserService {
6
7 // El compilador te avisa si pasas null aquí
8 public @NonNull User findByEmail(@NonNull String email) {
9 return userRepository.findByEmail(email)
10 .orElseThrow(() -> new UserNotFoundException(email));
11 }
12
13 // Explícitamente puede retornar null
14 public @Nullable User findOptionalByEmail(@NonNull String email) {
15 return userRepository.findByEmail(email).orElse(null);
16 }
17}
Resiliencia Nativa: Adiós a Resilience4j
Spring Boot 4 integra resiliencia de forma nativa. Ya no necesitas agregar Resilience4j como dependencia externa para retry, circuit breaker y control de concurrencia:
1@Service
2@EnableResilientMethods
3public class PaymentGateway {
4
5 // Reintenta 3 veces con backoff exponencial
6 @Retryable(maxAttempts = 3, backoff = @Backoff(delay = 1000, multiplier = 2))
7 public PaymentResult processPayment(PaymentRequest request) {
8 return externalPaymentApi.charge(request);
9 }
10
11 // Limita la concurrencia a 10 llamadas simultáneas
12 @ConcurrencyLimit(permits = 10)
13 public Report generateHeavyReport(ReportParams params) {
14 return reportEngine.generate(params);
15 }
16}
Todo se integra automáticamente con Micrometer 2, así que las métricas de retry, fallos y concurrencia se exponen en tu dashboard sin configuración adicional.
Observabilidad Unificada con Micrometer 2
Spring Boot 4 unifica métricas, logs y traces en un solo sistema de observabilidad:
1# application.yml — observabilidad completa con mínima config
2management:
3 tracing:
4 enabled: true
5 sampling:
6 probability: 1.0
7 otlp:
8 tracing:
9 endpoint: http://otel-collector:4318/v1/traces
10 metrics:
11 endpoint: http://otel-collector:4318/v1/metrics
12 endpoints:
13 web:
14 exposure:
15 include: health,info,metrics,prometheus
Con Actuator 4, los endpoints de salud y métricas son más granulares y eficientes que nunca.
Rendimiento: Los Números Hablan
Los benchmarks oficiales de Spring Boot 4 vs 3 son impresionantes:
| Métrica | Spring Boot 3.x | Spring Boot 4.0 | Mejora |
|---|---|---|---|
| Startup (JVM) | ~2.5s | ~1.8s | 28% más rápido |
| Startup (GraalVM native) | ~0.8s | ~0.4s | 50% más rápido |
| Consumo de RAM (JVM) | ~256 MB | ~160 MB | 37% menos |
| Consumo de RAM (native) | ~90 MB | ~55 MB | 39% menos |
| Throughput (req/s) | ~15,000 | ~22,000 | 47% más |
Guía de Migración: De Spring Boot 3 a 4
La migración es más sencilla de lo que parece. Sigue estos pasos:
- Actualiza primero a Spring Boot 3.5.x — la última versión estable de la serie 3
- Actualiza Java a 17+ (si aún no lo has hecho)
- Cambia la versión en tu
pom.xml - Revisa los imports de Jakarta EE — de EE 9 a EE 11
- Ejecuta tests y revisa los deprecation warnings
1<!-- pom.xml — cambio principal -->
2<parent>
3 <groupId>org.springframework.boot</groupId>
4 <artifactId>spring-boot-starter-parent</artifactId>
5 <!-- Antes: -->
6 <!-- <version>3.5.4</version> -->
7 <!-- Ahora: -->
8 <version>4.0.5</version>
9 <relativePath/>
10</parent>
1# Verifica compatibilidad con el migration guide
2# https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Migration-Guide
3
4# Compila y ejecuta tests
5./mvnw clean test
6
7# Si usas Moderne.io, la migración se puede automatizar:
8mod git clone moderne-io/spring-boot-4-migration
9mod run . --recipe SpringBoot4BestPractices
Conclusión
Spring Boot 4 no es solo una actualización incremental — es una reinvención del framework que aborda los problemas reales de las aplicaciones modernas: rendimiento, modularidad, observabilidad y escalabilidad.
Si estás en Spring Boot 3.x, el momento de migrar es ahora. La compatibilidad hacia atrás es excelente, los beneficios de rendimiento son inmediatos, y las nuevas funcionalidades como API versioning, resiliencia nativa y virtual threads de primera clase hacen que valga la pena cada minuto invertido en la migración.
La versión actual estable es 4.0.5 (marzo 2026), y Spring Boot 4.1 ya está en milestone 4 con aún más mejoras en camino.
Comments
Sign in to leave a comment
No comments yet. Be the first!
Related Articles
April 2, 2026
Elon Musk 2026: IPO de SpaceX por $1.75T, Starship V3, Neuralink, Tesla Optimus y el Terafab
CloudApril 2, 2026
Elon Musk 2026: SpaceX's $1.75T IPO, Starship V3, Neuralink, Tesla Optimus & the Terafab
CloudApril 2, 2026