Esta es la única lección del curso que no habla de CicloUrbana, y es deliberado. La red de Ribalta está construida, probada, desplegada, observada y revisada; lo que queda no es una pieza más del proyecto, sino la capacidad de seguir aprendiendo cuando ya no haya un temario que seguir.
Y eso tiene su propia técnica. Internet está lleno de material sobre Spring Boot, y buena parte está desactualizado de una forma especialmente traicionera: un tutorial de Spring Boot 2 no parece antiguo —el código compila casi igual— pero enseña javax.persistence en lugar de jakarta.persistence, WebSecurityConfigurerAdapter en lugar de SecurityFilterChain y Spring Cloud Sleuth en lugar de Micrometer Tracing. Saber distinguirlo vale más que cualquier lista de enlaces.
Esta lección organiza los recursos que sí merecen tu tiempo, comentados y con criterio: qué documentación leer y cómo, por qué el código fuente es la mejor fuente, cómo mantenerse al día y planificar una actualización de versión mayor, qué libros valen la pena y para quién, dónde está la comunidad, cómo practicar de verdad, qué temas son el siguiente paso natural desde donde estás ahora, y una hoja de ruta razonada para los próximos seis meses.
Contenido
- Aprender con criterio
- La documentación oficial y cómo leerla
- El código fuente como documentación
- Mantenerse al día
- Planificar una actualización de versión mayor
- El ecosistema Java
- Libros
- Certificaciones
- Comunidad
- Práctica deliberada
- Temas naturales para el siguiente paso
- Cómo evaluar un recurso
- Una hoja de ruta de seis meses
- Errores Comunes y Consejos
- Ejercicios
- Aprender con criterio
Un aviso antes de la lista, porque es lo que decide si el resto sirve de algo.
El cuello de botella no es el acceso a la información: es la atención. Hay más contenido sobre Spring Boot del que se puede consumir en una vida, y el impulso natural —guardar veinte enlaces, apuntarse a tres boletines, empezar cuatro cursos— produce la sensación de estar aprendiendo sin que se consolide nada. La forma que sí funciona tiene tres rasgos:
| Rasgo | Qué significa | Contraejemplo frecuente |
|---|---|---|
| Con un problema delante | Se aprende lo que hace falta para algo concreto | Ver un curso entero «por si acaso» |
| Escribiendo código | Teclear, romper y arreglar | Leer sobre WebFlux sin abrir el IDE |
| Con espaciado | Volver al tema días después | Una maratón de fin de semana que se olvida en dos |
Y una jerarquía de fuentes que conviene interiorizar, de más a menos fiable: el código fuente > la documentación de referencia > las guías oficiales > los libros de autores reconocidos > las conferencias > los artículos de blog > las respuestas de foros > el contenido generado sin revisión. No significa empezar siempre por arriba: significa que cuando dos fuentes se contradicen, gana la de arriba.
- La documentación oficial y cómo leerla
| Recurso | Qué es | Cuándo acudir |
|---|---|---|
| Spring Boot Reference Documentation | El manual completo: autoconfiguración, propiedades, empaquetado, Actuator | La referencia diaria. Su apéndice de propiedades comunes es la lista canónica de todo lo configurable |
| Spring Framework Reference | El núcleo: contenedor, AOP, transacciones, MVC, validación | Cuando la pregunta es sobre el mecanismo, no sobre Boot |
| Spring Data JPA Reference | Repositorios, consultas derivadas, proyecciones, Specification, auditoría |
Al escribir cualquier consulta no trivial |
| Spring Security Reference | Cadena de filtros, autorización, OAuth2, seguridad de método | Reorganizada para Spring Security 6: los ejemplos ya no usan el adaptador retirado |
| Guías de spring.io | Tutoriales cortos de una tarea concreta, mantenidos por el equipo | Para arrancar con algo nuevo en media hora |
| Notas de versión en el wiki de GitHub | Qué cambia en cada versión menor, con los cambios incompatibles marcados | Antes de subir de versión, siempre |
| Guías de migración | El camino de una versión mayor a la siguiente | Al planificar una actualización mayor (apartado 5) |
| Javadoc | El contrato exacto de cada clase | Cuando la referencia dice qué hace pero no con qué precisión |
Cómo leer la documentación de referencia sin perderse. Tres tácticas que cambian la experiencia:
- Búscala, no la leas de arriba abajo. Está escrita para consultarse. La estructura de secciones y el buscador integrado están pensados para llegar directamente al párrafo que responde a tu pregunta.
- Empieza por el apéndice de propiedades. Cuando dudes de si algo es configurable, la respuesta suele estar ahí, con el valor por defecto —que es la mitad de la información útil—.
- Lee las notas de versión de la versión que usas. Es media hora bien invertida: te enteras de funcionalidades que llevas meses reimplementando a mano.
Cómo leer javadoc con provecho. No es documentación de marketing: es el contrato. Lo que hay que buscar en él son las tres cosas que la firma no dice: qué ocurre en los casos límite (¿devuelve null o lista vacía?, ¿acepta cero?), qué excepciones lanza y cuándo, y si es seguro entre hilos. Ese último dato aparece con frecuencia en una frase del javadoc de clase y es exactamente el que se busca cuando algo falla bajo carga.
Un ejemplo concreto de recorrido, porque la técnica se entiende mejor en acción. Supón que quieres saber si puedes limitar el tamaño de la cola del ejecutor asíncrono y qué pasa cuando se llena:
| Paso | Dónde miras | Qué obtienes |
|---|---|---|
| 1 | Apéndice de propiedades, buscando task.execution |
Existen pool.queue-capacity, pool.max-size y sus valores por defecto |
| 2 | TaskExecutionProperties en el código fuente |
La lista tipada y completa, con los defaults en los campos |
| 3 | Javadoc de ThreadPoolTaskExecutor |
Que la cola se llena antes de que el pool crezca, y qué política de rechazo actúa después |
| 4 | Sección «Task Execution and Scheduling» de la referencia | Cómo lo cablea Spring Boot y cuándo tu bean sustituye al suyo |
Cuatro consultas, cinco minutos, y una respuesta que no depende de que ningún artículo la haya contado bien.
- El código fuente como documentación
Aquí está el consejo con mejor relación esfuerzo/beneficio de toda la lección: léete el código de Spring. Es abierto, está en GitHub, está razonablemente comentado y responde preguntas que ninguna documentación responde.
Por qué es la mejor fuente. La documentación describe la intención; el código describe el comportamiento. Cuando algo no funciona como esperabas, la diferencia entre ambos es exactamente donde está tu problema. Y a diferencia de un artículo, el código nunca está desactualizado respecto a sí mismo.
Tres cosas que conviene aprender a leer:
Las clases de autoconfiguración. Buscar *AutoConfiguration en el árbol de spring-boot-autoconfigure y leer una entera —DataSourceAutoConfiguration, JacksonAutoConfiguration o WebMvcAutoConfiguration— desmonta la sensación de magia de golpe. Se ve qué condiciones (@ConditionalOnClass, @ConditionalOnMissingBean) activan cada bean, y por tanto qué tienes que hacer para sustituirlo: casi siempre, declarar el tuyo.
Las clases *Properties. ServerProperties, JpaProperties o DataSourceProperties son la lista exacta y tipada de lo que se puede configurar, con sus valores por defecto en los campos. Suele ser más rápido que buscar en la documentación.
Los spring.factories y AutoConfiguration.imports. El fichero META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports es literalmente la lista de todo lo que Spring Boot puede autoconfigurar. Leerla una vez da una idea del alcance del framework que ninguna otra cosa da.
# Buscar en tu propio repositorio local de Maven, sin salir de la máquina
find ~/.m2 -name "spring-boot-autoconfigure-*-sources.jar"
./mvnw dependency:sources # descarga las fuentes de todas las dependenciasCon las fuentes descargadas, Ctrl+B sobre cualquier anotación en el IDE lleva a su definición. Ese es el hábito: cuando no entiendas por qué algo se comporta así, entra.
- Mantenerse al día
El ciclo de publicación y el soporte
Spring Boot publica una versión menor cada seis meses (noviembre y mayo, aproximadamente) y correcciones cada mes. Lo importante no es el calendario, sino la política de soporte:
| Tipo | Qué incluye | Duración típica |
|---|---|---|
| Soporte OSS | Correcciones de errores y de seguridad, gratis | ~12 meses desde la publicación de la versión menor |
| Soporte comercial | Correcciones de seguridad más allá del OSS, de pago | Varios años adicionales |
| Fin de vida | Nada: ni siquiera parches de seguridad | — |
La consecuencia práctica es dura y conviene asumirla: una aplicación en producción necesita subir de versión menor al menos una vez al año. No es una mejora opcional, es mantenimiento de seguridad. Un proyecto que lleva tres años en la misma versión menor no está «estable»: está acumulando vulnerabilidades conocidas sin parche.
La estrategia sana es subir pronto y a menudo: pasar de 3.3 a 3.4 en cuanto sale y hay tiempo es un trabajo de horas; pasar de 2.7 a 3.x con cuatro años de retraso es un proyecto de semanas.
Dónde enterarse
| Fuente | Qué aporta | Frecuencia |
|---|---|---|
| Blog oficial de Spring | Publicaciones, avisos de seguridad y artículos del equipo | La fuente primaria; suscríbete |
| This Week in Spring | Resumen semanal del ecosistema por el equipo de relaciones con desarrolladores | Semanal, se lee en cinco minutos |
| Spring Office Hours | Sesión periódica con el equipo, con preguntas reales | Vídeo, para el trayecto |
| InfoQ (Java) | Análisis con perspectiva, no solo anuncios | Mensual |
| Notas de versión en GitHub | El detalle exacto, con los cambios incompatibles | Antes de cada actualización |
| Avisos de seguridad de Spring | CVE que te afectan | Suscripción obligatoria en un proyecto real |
La última fila no es negociable: una vulnerabilidad conocida en un framework tan extendido se explota masivamente a las pocas horas de publicarse.
Cómo leer unas notas de versión en diez minutos. Tienen siempre la misma estructura y conviene recorrerla en este orden: primero «Breaking Changes», que es lo único que puede romperte y suele ocupar media pantalla; después «Deprecations», para saber qué tienes que empezar a cambiar aunque hoy siga funcionando; luego «Dependency Upgrades», donde se ve qué versiones de Hibernate, Jackson o Tomcat vienen dentro —y si alguna te afecta directamente—; y por último «New and Noteworthy», que es la parte divertida y la menos urgente. Leerlas al revés, empezando por las novedades, es el motivo por el que mucha gente se lleva sorpresas.
- Planificar una actualización de versión mayor
Subir de una versión mayor a la siguiente —el caso paradigmático es Spring Boot 2.7 → 3.0, con el salto de javax a jakarta— no es un cambio de número. Este es el procedimiento que funciona.
flowchart LR
A["0. Suite de pruebas<br/>en verde"] --> B["1. Leer la guía<br/>de migración"]
B --> C["2. properties-migrator:<br/>corregir el YAML"]
C --> D["3. OpenRewrite:<br/>lo mecánico"]
D --> E["4. Una versión menor<br/>cada vez"]
E --> F["5. Revisar lo que<br/>el BOM no gestiona"]
F --> G["6. Desplegar en pre<br/>y medir"]
E -->|"suite en rojo"| E
Paso 0: tener pruebas. Sin la suite del módulo 6, una actualización mayor es un salto al vacío. Si el proyecto no las tiene, escribirlas es el primer paso de la migración, no una tarea aparte.
Paso 1: leer la guía de migración entera, antes de tocar nada. Está en el wiki del repositorio de Spring Boot y enumera los cambios incompatibles uno a uno. Media hora de lectura ahorra días.
Paso 2: spring-boot-properties-migrator. Una dependencia temporal que, al arrancar, informa de las propiedades renombradas o retiradas y aplica temporalmente las equivalencias:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>Arrancas, lees el informe del log, corriges el YAML y quitas la dependencia. Dejarla puesta es un error clásico: enmascara los problemas en lugar de resolverlos.
Paso 3: OpenRewrite para lo mecánico. Las migraciones repetitivas —javax.* a jakarta.*, anotaciones retiradas, APIs renombradas— las hace una receta automática:
./mvnw org.openrewrite.maven:rewrite-maven-plugin:run \
-Drewrite.activeRecipes=org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_3Es un cambio masivo, así que va en un commit propio, sin mezclar nada, y se revisa leyendo la diferencia. OpenRewrite hace el 80 % del trabajo mecánico; el 20 % restante —lo que requiere criterio— sigue siendo tuyo.
Paso 4: subir de una versión menor cada vez. De 2.5 a 3.3 no se salta: se va 2.5 → 2.6 → 2.7 → 3.0 → …, con la suite en verde en cada escalón. Si algo se rompe, sabes exactamente qué escalón lo rompió.
Paso 5: revisar lo que el BOM no gestiona. Las dependencias con <version> propia —en CicloUrbana, JJWT, ShedLock, MapStruct, Resilience4j— no las sube Spring Boot. Son las que quedan atrás y las que dan sorpresas.
Paso 6: desplegar en pre y medir. Una actualización mayor puede cambiar el rendimiento en ambas direcciones. La línea base de k6 del módulo 9 existe exactamente para esto.
- El ecosistema Java
Spring Boot vive sobre Java, y desde hace unos años Java se mueve deprisa.
Versiones LTS y qué aportan. Las versiones con soporte extendido salen cada dos años, y son las que se usan en producción:
| Versión | Aportaciones más relevantes para una aplicación Spring |
|---|---|
| Java 17 | record, sealed, coincidencia de patrones en instanceof, bloques de texto, switch como expresión |
| Java 21 | Hilos virtuales, coincidencia de patrones en switch, record en patrones, colecciones secuenciadas |
| Java 25 | Consolidación de las anteriores, mejoras del recolector y de arranque |
De todo lo anterior, lo que ya usa CicloUrbana a diario son los record de los DTOs, los bloques de texto de las consultas JPQL, el switch como expresión y los hilos virtuales.
Project Loom y los hilos virtuales. Es el cambio conceptual más importante de la última década en Java: un hilo que al bloquearse en entrada/salida libera el hilo del sistema operativo en lugar de ocuparlo. Para una aplicación bloqueante con mucha espera de base de datos —que es la inmensa mayoría de las aplicaciones de gestión— permite alta concurrencia sin pila reactiva.
// Java 21: un millón de hilos que esperan, sin agotar el sistema operativo
try (var ejecutor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 1_000_000).forEach(i ->
ejecutor.submit(() -> { Thread.sleep(Duration.ofSeconds(1)); return i; }));
} // El try-with-resources espera a que terminen todas: no hace falta shutdown()Ese fragmento con hilos de plataforma agotaría la memoria mucho antes de llegar al millón. Merece la pena entenderlo a fondo, incluidas sus dos trampas: el pinning con synchronized y el hecho de que el límite real pasa a ser el pool de conexiones, como vimos en 09-01.
GraalVM e imágenes nativas. Compilar la aplicación a un ejecutable nativo reduce el arranque de segundos a milisegundos y la memoria a una fracción. A cambio, la compilación tarda minutos, la reflexión necesita RuntimeHints explícitos y el rendimiento sostenido puede ser algo menor que con la JVM. Su caso claro son las funciones sin servidor y los procesos de vida corta; para un servicio que arranca una vez al día, aporta poco.
Y una idea de fondo: Spring Boot es la parte más visible de tu trabajo, pero la que más se transfiere es Java. Un buen conocimiento del lenguaje, de la JVM y de la concurrencia sobrevive a cualquier framework.
- Libros
Solo obras ampliamente reconocidas, con a quién le sirve cada una. Un libro se lee en semanas y se consulta durante años; es el formato con mejor retorno a largo plazo.
| Libro | Autor | Para quién y para qué |
|---|---|---|
| Spring in Action | Craig Walls | Recorrido amplio y práctico de Spring; buen complemento a este curso, sobre todo por las áreas que no hemos tocado |
| Spring Boot: Up and Running | Mark Heckler | Enfoque directo en Boot, con buenas explicaciones de la autoconfiguración |
| Effective Java | Joshua Bloch | El libro que más mejora tu Java. Noventa elementos sobre diseño de API, genéricos, equals, inmutabilidad y concurrencia. Si solo lees uno, este |
| Clean Code | Robert C. Martin | Nombres, funciones y comentarios; base del módulo 10, aunque conviene leerlo con criterio propio y no como dogma |
| Refactoring (2.ª ed.) | Martin Fowler | El catálogo de transformaciones seguras; se usa como referencia, no se lee de corrido |
| Patterns of Enterprise Application Architecture | Martin Fowler | Explica de dónde vienen el repositorio, el mapeador de datos, la unidad de trabajo y el modelo anémico |
| Domain-Driven Design | Eric Evans | El original sobre lenguaje ubicuo, agregados y contextos delimitados. Denso; muchos empiezan por el siguiente |
| Implementing Domain-Driven Design | Vaughn Vernon | La versión aplicable de DDD, con código |
| Growing Object-Oriented Software, Guided by Tests | Freeman y Pryce | Cómo las pruebas guían el diseño; el mejor libro sobre el «por qué» de TDD |
| Unit Testing: Principles, Practices, and Patterns | Vladimir Khorikov | Qué probar y qué no, y por qué verificar interacciones produce pruebas frágiles |
| High-Performance Java Persistence | Vlad Mihalcea | La referencia sobre JPA e Hibernate en serio: N+1, identificadores, bloqueos, lotes, caché |
| Designing Data-Intensive Applications | Martin Kleppmann | Replicación, particionado, consistencia y transacciones distribuidas. Imprescindible antes de partir un sistema |
| Building Microservices (2.ª ed.) | Sam Newman | Honesto sobre los costes; el libro que hay que leer antes de decidir dividir |
| Site Reliability Engineering | Varios (Google) | SLI, SLO, presupuestos de error y guardias. Gratuito en línea |
| Observability Engineering | Majors, Fong-Jones y Miranda | El marco conceptual detrás del módulo 9 |
| Accelerate | Forsgren, Humble y Kim | La investigación detrás de las métricas DORA del módulo 8 |
| The Pragmatic Programmer | Hunt y Thomas | Oficio y actitud, más allá de cualquier tecnología |
Si tuvieras que elegir tres para los próximos seis meses, partiendo de donde estás: Effective Java (te hace mejor programador Java, no mejor usuario de Spring), High-Performance Java Persistence (porque la base de datos es donde está el tiempo) y Designing Data-Intensive Applications (porque es el que amplía la visión más allá de una aplicación).
- Certificaciones
La certificación de referencia del ecosistema es la VMware Spring Professional, que cubre contenedor, AOP, datos, MVC, seguridad, Boot y pruebas: aproximadamente el temario de este curso.
Una valoración honesta:
| A favor | En contra |
|---|---|
| Da una estructura y una fecha límite, que a mucha gente le ordena el estudio | Cuesta dinero y varias semanas de preparación |
| Obliga a cubrir áreas que uno evita | Premia memorizar detalles que se consultan en un segundo |
| En algunos mercados y consultoras, filtra currículums | Nadie con experiencia contrata por una certificación |
| El temario está bien elegido | Caduca: el ecosistema se mueve más rápido que el examen |
Cuándo compensa, en concreto: si trabajas en una consultora donde influye en la asignación de proyectos o en la tarifa; si tu empresa la paga y te da tiempo; o si necesitas una estructura externa para estudiar de forma consistente. Cuándo no: si el objetivo es demostrar que sabes. Para eso, un proyecto público bien hecho —con pruebas, canalización y README decente— dice muchísimo más, y es lo que de verdad se mira en una entrevista técnica.
Existen además certificaciones adyacentes que en muchos contextos valen más que la de Spring: las de Kubernetes (CKA y CKAD) y las de los proveedores de nube, porque cubren un área donde la demanda supera con claridad a la oferta y donde el examen es práctico, con una terminal de verdad, en lugar de una batería de preguntas. Si el objetivo es la empleabilidad y ya sabes Spring Boot, esa dirección suele ser mejor inversión.
- Comunidad
| Sitio | Para qué sirve | Cómo aprovecharlo |
|---|---|---|
Stack Overflow (etiquetas spring-boot, spring-data-jpa) |
Preguntas concretas ya resueltas | Mira la fecha y la versión de las respuestas; y filtra por votos, no por aceptación |
| Rastreador de incidencias de Spring (GitHub) | Saber si «eso raro» es un error conocido | Buscar el mensaje de error literal antes de preguntar en ningún sitio |
| Discusiones de GitHub de los proyectos | Preguntas de diseño respondidas por el equipo | Muy infrautilizado |
| SpringOne | La conferencia del ecosistema; charlas del equipo | Las grabaciones son gratuitas |
| Devoxx, Codemotion, JavaZone | Java y ecosistema en general | Devoxx publica casi todo en abierto |
| Grupos locales de Java (JUG) | Charlas y contactos en tu ciudad | El valor real está en la conversación posterior, no en la charla |
Y el consejo sobre preguntar, que sirve en cualquiera de estos sitios: una buena pregunta incluye la versión de Spring Boot, un ejemplo mínimo que reproduzca el problema, el mensaje de error completo y lo que ya has intentado. Preparar esa pregunta resuelve el problema por sí sola una de cada tres veces, y el fenómeno tiene nombre —rubber duck debugging—: la obligación de explicar el problema con precisión te hace ver el hueco de tu razonamiento.
Sobre el rastreador de incidencias, que merece un párrafo propio porque casi nadie lo usa: cuando Spring hace algo que no entiendes, hay una probabilidad alta de que alguien ya lo haya reportado, y de que un miembro del equipo haya explicado por qué funciona así. Esas respuestas son con frecuencia mejores que la documentación, porque responden a la pregunta exacta que tú tienes. Buscar el mensaje de error literal entre comillas es el primer movimiento, antes de escribir en ningún foro.
- Práctica deliberada
Leer sobre programación no enseña a programar, igual que leer sobre natación no enseña a nadar. Cuatro formas de practicar que sí funcionan:
Proyectos propios de dificultad creciente. El error habitual es empezar por «una red social»: demasiado grande, se abandona en la semana tres. Una progresión que funciona:
| Nivel | Proyecto | Qué te obliga a resolver |
|---|---|---|
| 1 | Un CRUD con autenticación y pruebas, desplegado | Todo el flujo, de principio a fin. Suena poco y no lo es |
| 2 | Añadirle una integración externa con cortacircuitos y caché | Fallos parciales, tiempos de espera, invalidación |
| 3 | Añadirle trabajo en segundo plano y notificaciones | Concurrencia, idempotencia, entrega |
| 4 | Someterlo a una prueba de carga y optimizarlo hasta un SLO | Medir, perfilar, decidir |
| 5 | Extraer una parte a un servicio aparte, con mensajería | Consistencia eventual, contratos, trazabilidad |
Las siete extensiones de 10-04 cubren exactamente esa progresión sobre un proyecto que ya conoces.
Contribuir a un proyecto libre. Empieza por documentación o por una incidencia etiquetada como buena para empezar. Lo que se aprende no es tanto el código como el proceso: revisiones exigentes, pruebas obligatorias, discusiones de diseño en abierto. Es la forma más barata de trabajar con gente mejor que tú.
Katas y ejercicios cortos. Repetir un problema pequeño concentrándote en una cosa cada vez —esta vez con TDD, esta vez sin if, esta vez con nombres perfectos— es lo más parecido a practicar escalas. Media hora a la semana.
Leer código ajeno. El hábito más infravalorado. Elige un proyecto Spring Boot bien valorado en GitHub y léelo como se lee un libro: la estructura de paquetes, un servicio, sus pruebas, su canalización. Vas a encontrar decisiones distintas a las de este curso, y entender por qué las tomaron es más formativo que estar de acuerdo.
Y una advertencia sobre las tres primeras: la práctica sin retroalimentación no es práctica deliberada, es repetición. Escribir código que nadie revisa consolida tanto los aciertos como los errores. Las tres fuentes de retroalimentación disponibles, de más a menos accesible, son: las pruebas, que te dicen si funciona; las herramientas de 10-03 —ArchUnit, SpotBugs, el análisis estático—, que te dicen si está bien construido; y una persona, que es la única que te dice si está bien pensado. Si trabajas solo, contribuir a un proyecto libre es la forma más barata de conseguir la tercera.
- Temas naturales para el siguiente paso
Todos estos parten de algo que ya sabes. La tercera columna es la que importa: dice qué lección te dejó preparado.
| Tema | Qué es | Qué del curso te prepara |
|---|---|---|
| Spring Modulith | Módulos con fronteras verificadas dentro del monolito, con eventos y pruebas por módulo | Los paquetes por funcionalidad de 01-04 y las reglas de ArchUnit de 10-03 |
| Mensajería con Kafka o RabbitMQ | Comunicación asíncrona duradera entre sistemas | El límite de @Async en 07-03 y los eventos de 04-07 |
| Spring Batch | Procesos por lotes con reinicio, reintentos y fragmentación | Las tareas programadas de 07-03 y el importador con TransactionTemplate de 04-07 |
| WebFlux y R2DBC | Pila reactiva no bloqueante | El modelo de hilos de 09-01. Con una advertencia: los hilos virtuales de Java 21 cubren hoy buena parte de su caso de uso con mucha menos complejidad |
| Arquitectura hexagonal | Puertos y adaptadores; el dominio en el centro | La regla de dependencia de 10-01 y el dominio sin framework de 10-03 |
| DDD táctico | Agregados, objetos de valor, eventos de dominio, repositorios | La discusión del modelo anémico de 10-03 y los eventos de 02-02 |
| Kubernetes en profundidad | Operadores, mallas de servicio, políticas de red, GitOps | Los manifiestos y Helm de 08-04 |
| Spring AI | Integración con modelos de lenguaje desde Spring | El patrón de cliente externo con tolerancia a fallos de 07-06 |
| OAuth2 y OpenID Connect | Delegar la identidad en un proveedor | El JWT propio de 05-04, que es la versión artesanal del mismo problema |
Cuál elegir primero. No el que más suene, sino el que resuelva un problema que tengas. Si tu aplicación pierde trabajo cuando se reinicia, mensajería. Si dos equipos se pisan en el mismo código, Spring Modulith. Si el dominio se te está diluyendo en los servicios, DDD táctico. Y si nada te duele todavía, el orden que mejor consolida lo aprendido es Spring Modulith → mensajería → DDD táctico.
- Cómo evaluar un recurso
Tres preguntas, en este orden, antes de invertir tiempo en un artículo, un vídeo o un curso:
1. ¿De cuándo es? Si no hay fecha visible, desconfía. Un artículo sin fecha sobre un framework que publica dos versiones al año no es un recurso, es un riesgo.
2. ¿Qué versión de Spring Boot usa? Es la pregunta decisiva, y casi siempre se responde mirando el código en diez segundos:
| Señal | Qué indica |
|---|---|
javax.persistence, javax.servlet, javax.validation |
Spring Boot 2: el salto a Jakarta EE 9+ renombró todos esos paquetes en Boot 3 |
WebSecurityConfigurerAdapter |
Spring Security 5: retirado, sustituido por SecurityFilterChain |
@EnableGlobalMethodSecurity |
Idem: hoy es @EnableMethodSecurity |
spring-cloud-starter-sleuth |
Descontinuado: hoy es Micrometer Tracing |
WebMvcConfigurerAdapter, @MockBean |
Adaptador retirado; @MockBean sustituido por @MockitoBean en Boot 3.4+ |
RestTemplate como recomendación |
No está retirado, pero desde Boot 3.2 la opción por defecto es RestClient |
application.properties con spring.datasource.initialize |
Propiedades de Boot 1.x |
Por qué un tutorial de Spring Boot 2 confunde más de lo que ayuda. No es que esté «un poco anticuado»: es que el código no compila en un proyecto Boot 3 —cambian los paquetes de todas las anotaciones de persistencia, validación y servlet— y, peor, la explicación conceptual sigue siendo plausible. El lector novato no distingue entre «esto ya no existe» y «esto lo he escrito mal», y pierde horas. Con la tabla anterior, esos diez segundos de comprobación te ahorran la tarde.
3. ¿Quién lo firma y qué se juega? Un artículo del equipo de Spring, de un autor con trayectoria o de un proyecto con revisión entre pares tiene un incentivo para estar bien. Un contenido optimizado para posicionamiento, no.
Y un cuarto criterio que aplica sobre todo al contenido generado automáticamente, cada vez más abundante: si el código no se puede ejecutar tal cual, sospecha. Los ejemplos que mezclan versiones, inventan métodos que no existen o llaman a APIs de dos épocas distintas son la firma característica.
- Una hoja de ruta de seis meses
Una propuesta concreta y razonada para quien termina este curso y quiere consolidar en lugar de dispersarse. El principio que la ordena: cada mes tiene una entrega, y cada entrega se apoya en la anterior.
| Mes | Foco | Entrega concreta |
|---|---|---|
| 1 | Consolidar lo aprendido. Nada nuevo | Implementar dos extensiones de 10-04: el panel de operario y los informes con exportación. Con pruebas y desplegado |
| 2 | Java, no Spring. Effective Java | Refactorizar el proyecto aplicando diez elementos concretos del libro; escribir qué mejoró y qué no |
| 3 | Persistencia en serio. High-Performance Java Persistence | Prueba de carga con datos realistas, EXPLAIN ANALYZE sobre las cinco consultas más caras, índices y una mejora medida de p95 |
| 4 | Mensajería. Kafka o RabbitMQ con Spring | Extraer las notificaciones a un consumidor de mensajes, con patrón outbox, idempotencia y trazas que crucen la frontera |
| 5 | Diseño. Spring Modulith y DDD táctico | Reorganizar el proyecto en módulos con fronteras verificadas y eventos entre ellos; mover al dominio las reglas que hoy viven en servicios |
| 6 | Producción de verdad. SRE y observabilidad | Definir SLO con presupuesto de error, alertas sobre síntomas, cuadro de mando y un ensayo de incidente cronometrado |
Por qué este orden y no otro. El mes 1 no aprende nada nuevo a propósito: lo recién visto se consolida usándolo, no añadiendo temas encima. El mes 2 es Java y no Spring porque es lo que más se transfiere y lo que menos caduca. El mes 3 ataca donde de verdad está el tiempo. El 4 y el 5 son los dos saltos conceptuales —comunicación asíncrona y diseño de dominio— y van después de tener la base sólida. Y el 6 cierra el ciclo, porque operar lo que uno construye es lo que convierte a un programador en un ingeniero.
Cómo hacerla realista. Cuatro o cinco horas a la semana, con una entrega visible cada mes. Un plan de veinte horas semanales no se cumple y produce culpa; uno de cinco horas mantenido seis meses produce un cambio real. Y si algún mes no sale, no se salta: se retrasa. La secuencia importa más que el calendario.
Y si tu situación es otra, adáptala con este criterio en lugar de copiarla. Si estás buscando trabajo, mueve el mes 6 al principio: un proyecto desplegado y observable es lo que se enseña en una entrevista. Si tu equipo va a partir el monolito el trimestre que viene, adelanta el mes 4 y añade Designing Data-Intensive Applications. Si acabas de entrar en un proyecto heredado, los meses 1 y 2 se sustituyen por escribir pruebas de caracterización y actualizar la versión, que es lo que desbloquea todo lo demás. La hoja de ruta correcta es la que ataca el problema que tienes hoy, no la que cubre más temas.
Errores Comunes y Consejos
Coleccionar recursos en lugar de usarlos. Cincuenta pestañas abiertas y tres cursos empezados producen la sensación de estar aprendiendo y ningún aprendizaje. Un recurso a la vez, con un problema delante.
Seguir un tutorial sin comprobar la versión. Es la causa número uno de horas perdidas con Spring. Diez segundos mirando si dice javax o jakarta te los ahorran.
Aprender lo nuevo antes de dominar lo actual. WebFlux, GraalVM o Spring AI son interesantes; si aún no tienes claro cómo funciona el proxy de @Transactional, no son tu siguiente paso.
Copiar configuración sin entenderla. Un application.yml copiado de un blog trae propiedades que no necesitas, algunas peligrosas —ddl-auto: update, Actuator abierto, show-sql activo— y ninguna explicación.
Confundir «he leído sobre esto» con «sé hacer esto». La prueba es sencilla y es implacable: abrir el IDE y hacerlo sin mirar.
Aceptar sin verificar el código que sugiere un asistente. Los modelos de lenguaje se entrenan con todo lo que hay publicado, y lo que hay publicado sobre Spring Boot es mayoritariamente de la era 2.x: verás WebSecurityConfigurerAdapter, javax.persistence y @MockBean con una seguridad absoluta. Son herramientas excelentes para explorar y para escribir lo repetitivo, y aplican exactamente los mismos criterios del apartado 12: comprueba la versión, ejecútalo y no lo pegues si no lo entiendes.
Estudiar solo lo que ya te gusta. Es cómodo profundizar en lo que uno domina y evitar lo que le resulta ajeno —para muchos programadores, la operación y la base de datos—. Y es justo ahí donde suele estar la mayor diferencia entre lo que sabes y lo que el proyecto necesita.
Consejo: escribe lo que aprendes. Un artículo, una nota interna o un archivo docs/decisiones/ en tu proyecto. Explicar algo obliga a entenderlo de verdad, y descubre los huecos que la lectura pasiva esconde.
Consejo: mantén un proyecto vivo. Un repositorio propio al que vuelves cada pocas semanas vale más que diez cursos. Es donde probar cada cosa nueva y donde comprobar si funciona en tus manos y no solo en las del autor.
Consejo: aprende a leer código antes que a escribirlo. La mayor parte de tu carrera la pasarás leyendo: el código de tu equipo, el de un framework, el de alguien que se fue hace tres años. Es una habilidad que se entrena, y casi nadie la entrena a propósito.
Consejo: cuando algo te sorprenda, para y entra. Ese instante de «anda, no sabía que hacía eso» es la mejor señal de aprendizaje disponible, y se desperdicia casi siempre porque hay prisa. Diez minutos leyendo la clase que lo provoca valen más que dos horas de un curso sobre algo que no te ha sorprendido nunca.
Consejo: la mejor forma de estudiar un tema nuevo es escribir el ejemplo más pequeño posible. No un proyecto: un módulo Maven de tres clases que hace una cosa. Un consumidor de Kafka que imprime mensajes. Un @Observed que produce un span. Es rápido de escribir, rápido de tirar, y contesta preguntas que ningún artículo contesta.
Ejercicios
Ejercicio 1: evaluar tres recursos
Busca tres artículos o tutoriales sobre «Spring Boot JWT authentication» en cualquier buscador. Para cada uno, aplica los criterios del apartado 12 y redacta una ficha con: fecha, versión de Spring Boot deducida y con qué señal concreta la has deducido, si el código compilaría hoy, tres cosas que harías distinto según lo aprendido en el módulo 5, y tu veredicto final. Es muy probable que al menos uno esté desactualizado; el ejercicio consiste en detectarlo en menos de un minuto.
Ejercicio 2: leer una clase de autoconfiguración
Descarga las fuentes con ./mvnw dependency:sources y abre DataSourceAutoConfiguration (o JacksonAutoConfiguration, si prefieres algo más corto). Responde: ¿qué condiciones deben cumplirse para que se active? ¿qué beans declara? ¿qué anotación hace que tu propio bean gane al suyo? ¿de qué clase *Properties lee la configuración y qué valores por defecto tiene? Y por último: ¿qué tendrías que hacer para sustituir por completo su DataSource por uno tuyo?
Ejercicio 3: tu propia hoja de ruta
Adapta la hoja de ruta del apartado 13 a tu situación real. Parte de tres preguntas: ¿qué problema tienes hoy en tu trabajo o en tu proyecto que Spring Boot no te ha resuelto todavía?, ¿cuántas horas a la semana puedes sostener de verdad durante seis meses?, y ¿qué entrega visible marcaría cada mes? Escribe el resultado con una entrega por mes y un criterio objetivo para saber si la has cumplido.
Soluciones
Solución 1
Un ejemplo de ficha bien hecha, sobre un caso muy habitual:
Artículo A — Sin fecha visible (primera señal de alarma; en el pie del blog aparece 2021). Versión deducida: Spring Boot 2.5. Señales, por orden de contundencia: extiende
WebSecurityConfigurerAdaptery sobrescribeconfigure(HttpSecurity), retirado en Spring Security 5.7; importajavax.servlet.FilterChain; usaantMatchers(...), sustituido porrequestMatchers(...); yio.jsonwebtoken0.9.1, cuya APIJwts.parser().setSigningKey(String)ya no existe en 0.12. ¿Compilaría hoy? No. Fallaría en losimportdejavax.*y en la clase base retirada, y ni siquiera llegaría a los errores de la API de JJWT. Tres cosas que haría distinto según el módulo 5: (1)SecurityFilterChaincomo bean en lugar del adaptador, conauthorizeHttpRequeststerminado enanyRequest().denyAll(); (2) el secreto por variable de entorno y de 256 bits, no una constante"secret"en el código; (3) token de acceso de quince minutos con refresco rotatorio, en lugar de las diez horas del artículo. Veredicto: descartar. No por antiguo, sino porque el error que enseña es de seguridad, que es la peor categoría para copiar sin entender.
Las tres señales que resuelven el 90 % de los casos en diez segundos: javax frente a jakarta, WebSecurityConfigurerAdapter, y spring-cloud-starter-sleuth. Si aparece cualquiera de las tres, el recurso es de la era Spring Boot 2.
Y el matiz que evita ser injusto: un recurso antiguo puede seguir siendo conceptualmente correcto. La explicación de qué es un JWT, por qué se firma y por qué su carga útil es legible no ha cambiado. Lo que no se puede copiar es el código.
Solución 2
Sobre DataSourceAutoConfiguration, las respuestas y —más importante— lo que enseña cada una:
¿Qué condiciones la activan? @ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class}), es decir, solo si esas clases están en el classpath. De ahí la regla que explica toda la autoconfiguración: añadir un starter de datos no «enciende» nada mágicamente; simplemente pone clases en el classpath y las condiciones se cumplen.
¿Qué beans declara? Un DataSource, resuelto en configuraciones anidadas: si detecta HikariCP lo usa (@ConditionalOnClass(HikariDataSource.class)), y si no prueba con Tomcat JDBC o DBCP2, en ese orden. También declara DataSourceInitializer y los beans de propiedades.
¿Qué hace que tu bean gane? @ConditionalOnMissingBean. Es la anotación clave de todo Spring Boot: la autoconfiguración solo actúa si tú no has decidido nada. Declarar tu propio @Bean DataSource la desactiva sin necesidad de excluir nada.
¿De dónde lee? De DataSourceProperties (prefijo spring.datasource), donde están url, username, password, driverClassName, generate-unique-name y el resto, con sus valores por defecto escritos en los campos —que es más rápido de consultar que la documentación—.
¿Cómo sustituirlo del todo? Tres formas, de mejor a peor: declarar tu propio @Bean DataSource, que gana por @ConditionalOnMissingBean; excluirla con @SpringBootApplication(exclude = DataSourceAutoConfiguration.class); o quitar la dependencia, con lo que la condición de clase deja de cumplirse.
Lo que el ejercicio enseña de verdad no es esta clase, sino el patrón: @ConditionalOnClass + @ConditionalOnMissingBean + una clase *Properties. Con eso entiendes las doscientas autoconfiguraciones restantes, incluida la del starter propio que escribimos en 02-06. Y confirma la afirmación del apartado 3: cuando lees el código, la magia desaparece.
Solución 3
No hay solución única, pero sí una forma reconocible de haber hecho bien el ejercicio. Un ejemplo:
Situación: trabajo en un equipo de cuatro personas con un monolito Spring Boot 2.7 que nadie se atreve a actualizar. Puedo sostener cuatro horas a la semana. El problema real no es técnico: es que no hay pruebas y por eso nadie toca nada.
Mes Foco Entrega Criterio objetivo 1 Pruebas de caracterización de los tres flujos críticos Suite que se ejecuta en CI ./mvnw verifyen verde en la canalización, no en mi portátil2 Actualización a Spring Boot 3, escalón a escalón Rama con 2.7 → 3.0 → 3.3La suite del mes 1 en verde en cada escalón 3 Effective Java + refactorización de un módulo Módulo de facturación limpio Diez elementos aplicados, documentados en docs/decisiones/4 Rendimiento: k6, EXPLAIN ANALYZE, índicesLínea base y una mejora medida p95 del endpoint peor por debajo de 300 ms 5 Observabilidad: métricas, logs y trazas Cuadro de mando y dos alertas Provocar un incidente y diagnosticarlo en menos de diez minutos 6 Spring Modulith Fronteras entre facturación y pedidos Reglas de ArchUnit que fallan si alguien las cruza
Lo que hace buena esta hoja de ruta: el mes 1 no es «aprender algo», es quitar el bloqueo real —sin pruebas no se puede hacer nada de lo demás—; cada mes tiene un criterio objetivo y verificable, no «entender X»; el orden respeta las dependencias entre temas; y las horas son las que la persona puede sostener de verdad, no las que le gustaría.
El error típico al hacer este ejercicio es escribir una lista de tecnologías que suenan bien —Kafka, Kubernetes, WebFlux, GraalVM— sin ningún problema detrás. Una hoja de ruta sin un problema que resolver se abandona en la semana cinco.
Y una comprobación final que conviene hacerse: si dentro de seis meses cumplieras el plan entero, ¿qué sabrías hacer que hoy no sabes? Si la respuesta se puede formular con verbos —«actualizar un proyecto heredado sin miedo», «diagnosticar un p99 alto en diez minutos»— el plan es bueno. Si solo se puede formular con sustantivos —«Kafka», «Kubernetes»—, todavía es una lista de temas y no una hoja de ruta.
Conclusión
Aquí termina el curso, y conviene mirar el camino completo antes de cerrarlo.
Empezamos en 01-03 con un @RestController de nueve líneas que devolvía cuatro estaciones escritas a mano y un curl que respondía en localhost:8080. Terminamos con CicloUrbana: una aplicación con un contrato REST versionado y documentado, con sus DTOs, su validación y sus errores en RFC 7807; con persistencia sobre PostgreSQL gobernada por nueve migraciones de Flyway y transacciones que garantizan que ninguna bicicleta de Ribalta quede bloqueada a medias; con autenticación JWT, jerarquía de roles y reglas de seguridad que dependen del dato y no solo de la ruta; con una suite de pruebas que va de la unidad de un milisegundo al flujo completo sobre un PostgreSQL real y efímero; con tareas programadas coordinadas entre réplicas y trabajo asíncrono que no bloquea al ciudadano; empaquetada en una imagen multietapa, desplegada en Kubernetes por una canalización que la construye, la escanea y la promociona sola; y observada de extremo a extremo, donde la métrica detecta, la traza localiza y el log explica, unidos por un mismo traceId. Y con el criterio, al final, para saber por qué está hecha así y dónde habría que romper cada regla.
Lo importante es que casi nada de eso es específico de Spring Boot. La inversión de control, la separación entre dominio y contrato, la atomicidad de un caso de uso, la denegación por defecto, la pirámide de pruebas, medir antes de optimizar, los percentiles en lugar de la media, las migraciones compatibles hacia atrás, un artefacto para todos los entornos, los secretos fuera del repositorio, los logs estructurados y correlacionados, la deuda técnica registrada con su coste: todo eso viaja contigo a cualquier framework, a cualquier lenguaje y a cualquier equipo. Spring Boot ha sido el vehículo; lo que has aprendido a conducir es más grande.
Quedan cosas por saber, y siempre quedarán. Es la parte incómoda y también la mejor de este oficio: nadie termina de aprenderlo, y la diferencia entre alguien con dos años de experiencia y alguien con quince no es el número de frameworks que conoce, sino la calidad de las preguntas que se hace antes de decidir. Este curso ha intentado, sobre todo, enseñarte esas preguntas: ¿qué problema resuelve esto?, ¿qué me cuesta?, ¿cómo sabré si funciona?, ¿qué pasa cuando falle?, ¿lo entenderá el próximo que lo lea?
Ahora te toca a ti. Coge CicloUrbana y llévala a algún sitio: añade las tarifas dinámicas, extrae la facturación, conéctala a un mapa. O empieza algo tuyo, más pequeño y más real, y hazlo bien de principio a fin. Lo que no funciona es esperar a saberlo todo antes de construir: se aprende construyendo, midiendo lo que se construye y arreglando lo que se rompe.
La red de Ribalta está en marcha. Gracias por llegar hasta aquí, y buen viaje.
Curso de Spring Boot
Módulo 1: Introducción a Spring Boot
- ¿Qué es Spring Boot?
- Configuración de tu Entorno de Desarrollo
- Creando tu Primera Aplicación Spring Boot
- Entendiendo la Estructura del Proyecto
- El Arranque y el Ciclo de Vida de la Aplicación
Módulo 2: Conceptos Básicos de Spring Boot
- Anotaciones de Spring Boot
- Inyección de Dependencias en Spring Boot
- Ámbito y Ciclo de Vida de los Beans
- Configuración de Spring Boot
- Propiedades de Spring Boot
- Autoconfiguración y Starters por Dentro
Módulo 3: Construyendo Servicios Web RESTful
- Introducción a los Servicios Web RESTful
- Creando Controladores REST
- Manejo de Métodos HTTP
- Validación de Datos de Entrada
- DTOs y Mapeo entre Capas
- Manejo de Excepciones en REST
- Documentar la API con OpenAPI
Módulo 4: Acceso a Datos con Spring Boot
- Introducción a Spring Data JPA
- Configuración de Fuentes de Datos
- Creación de Entidades JPA
- Relaciones entre Entidades
- Uso de Repositorios de Spring Data
- Métodos de Consulta en Spring Data JPA
- Transacciones y Gestión de la Persistencia
- Migraciones de Esquema con Flyway
Módulo 5: Seguridad en Spring Boot
- Introducción a Spring Security
- Configuración de Spring Security
- Autenticación y Autorización de Usuarios
- Implementación de Autenticación JWT
- Seguridad a Nivel de Método y Endurecimiento de la API
Módulo 6: Pruebas en Spring Boot
- Introducción a las Pruebas
- Pruebas Unitarias con JUnit
- Simulación con Mockito
- Pruebas de Integración
- Pruebas con Testcontainers
Módulo 7: Funciones Avanzadas de Spring Boot
- Spring Boot Actuator
- Perfiles de Spring Boot
- Tareas Programadas y Ejecución Asíncrona
- Spring Boot con Docker
- Spring Boot y Microservicios
- Comunicación entre Servicios y Tolerancia a Fallos
Módulo 8: Despliegue de Aplicaciones Spring Boot
- Introducción al Despliegue
- Desplegando en Heroku
- Desplegando en AWS
- Desplegando en Kubernetes
- Integración y Entrega Continua
Módulo 9: Rendimiento y Monitoreo
- Ajuste de Rendimiento
- Caché con Spring Cache
- Monitoreo con Spring Boot Actuator
- Uso de Prometheus y Grafana
- Gestión de Registros y Logs
- Trazabilidad Distribuida
