Aquesta és l'única lliçó del curs que no parla de CicloUrbana, i és deliberat. La xarxa de Ribalta està construïda, provada, desplegada, observada i revisada; el que queda no és una peça més del projecte, sinó la capacitat de continuar aprenent quan ja no hi hagi un temari a seguir.
I això té la seva pròpia tècnica. Internet és ple de material sobre Spring Boot, i bona part està desactualitzat d'una manera especialment traïdora: un tutorial de Spring Boot 2 no sembla antic —el codi compila gairebé igual— però ensenya javax.persistence en lloc de jakarta.persistence, WebSecurityConfigurerAdapter en lloc de SecurityFilterChain i Spring Cloud Sleuth en lloc de Micrometer Tracing. Saber distingir-ho val més que qualsevol llista d'enllaços.
Aquesta lliçó organitza els recursos que sí que mereixen el teu temps, comentats i amb criteri: quina documentació llegir i com, per què el codi font és la millor font, com mantenir-se al dia i planificar una actualització de versió major, quins llibres valen la pena i per a qui, on és la comunitat, com practicar de debò, quins temes són el pas següent natural des d'on ets ara, i un full de ruta raonat per als propers sis mesos.
Contingut
- Aprendre amb criteri
- La documentació oficial i com llegir-la
- El codi font com a documentació
- Mantenir-se al dia
- Planificar una actualització de versió major
- L'ecosistema Java
- Llibres
- Certificacions
- Comunitat
- Pràctica deliberada
- Temes naturals per al pas següent
- Com avaluar un recurs
- Un full de ruta de sis mesos
- Errors Comuns i Consells
- Exercicis
- Aprendre amb criteri
Un avís abans de la llista, perquè és el que decideix si la resta serveix d'alguna cosa.
El coll d'ampolla no és l'accés a la informació: és l'atenció. Hi ha més contingut sobre Spring Boot del que es pot consumir en una vida, i l'impuls natural —desar vint enllaços, apuntar-se a tres butlletins, començar quatre cursos— produeix la sensació d'estar aprenent sense que es consolidi res. La manera que sí que funciona té tres trets:
| Tret | Què significa | Contraexemple freqüent |
|---|---|---|
| Amb un problema al davant | S'aprèn el que cal per a alguna cosa concreta | Veure un curs sencer «per si de cas» |
| Escrivint codi | Teclejar, trencar i arreglar | Llegir sobre WebFlux sense obrir l'IDE |
| Amb espaiat | Tornar al tema dies després | Una marató de cap de setmana que s'oblida en dos |
I una jerarquia de fonts que convé interioritzar, de més a menys fiable: el codi font > la documentació de referència > les guies oficials > els llibres d'autors reconeguts > les conferències > els articles de blog > les respostes de fòrums > el contingut generat sense revisió. No vol dir començar sempre per dalt: vol dir que quan dues fonts es contradiuen, guanya la de dalt.
- La documentació oficial i com llegir-la
| Recurs | Què és | Quan acudir-hi |
|---|---|---|
| Spring Boot Reference Documentation | El manual complet: autoconfiguració, propietats, empaquetament, Actuator | La referència diària. El seu apèndix de propietats comunes és la llista canònica de tot el que és configurable |
| Spring Framework Reference | El nucli: contenidor, AOP, transaccions, MVC, validació | Quan la pregunta és sobre el mecanisme, no sobre Boot |
| Spring Data JPA Reference | Repositoris, consultes derivades, projeccions, Specification, auditoria |
En escriure qualsevol consulta no trivial |
| Spring Security Reference | Cadena de filtres, autorització, OAuth2, seguretat de mètode | Reorganitzada per a Spring Security 6: els exemples ja no fan servir l'adaptador retirat |
| Guies de spring.io | Tutorials curts d'una tasca concreta, mantinguts per l'equip | Per arrencar amb alguna cosa nova en mitja hora |
| Notes de versió al wiki de GitHub | Què canvia a cada versió menor, amb els canvis incompatibles marcats | Abans de pujar de versió, sempre |
| Guies de migració | El camí d'una versió major a la següent | En planificar una actualització major (apartat 5) |
| Javadoc | El contracte exacte de cada classe | Quan la referència diu què fa però no amb quina precisió |
Com llegir la documentació de referència sense perdre's. Tres tàctiques que canvien l'experiència:
- Cerca-hi, no la llegeixis de dalt a baix. Està escrita per consultar-se. L'estructura de seccions i el cercador integrat estan pensats per arribar directament al paràgraf que respon la teva pregunta.
- Comença per l'apèndix de propietats. Quan dubtis de si alguna cosa és configurable, la resposta sol ser-hi, amb el valor per defecte —que és la meitat de la informació útil—.
- Llegeix les notes de versió de la versió que fas servir. És mitja hora ben invertida: t'assabentes de funcionalitats que fa mesos que reimplementes a mà.
Com llegir javadoc amb profit. No és documentació de màrqueting: és el contracte. El que cal buscar-hi són les tres coses que la signatura no diu: què passa en els casos límit (retorna null o llista buida?, accepta zero?), quines excepcions llança i quan, i si és segur entre fils. Aquesta última dada apareix sovint en una frase del javadoc de classe i és exactament la que es busca quan alguna cosa falla sota càrrega.
Un exemple concret de recorregut, perquè la tècnica s'entén millor en acció. Suposa que vols saber si pots limitar la mida de la cua de l'executor asíncron i què passa quan s'omple:
| Pas | On mires | Què obtens |
|---|---|---|
| 1 | Apèndix de propietats, cercant task.execution |
Existeixen pool.queue-capacity, pool.max-size i els seus valors per defecte |
| 2 | TaskExecutionProperties al codi font |
La llista tipada i completa, amb els defaults als camps |
| 3 | Javadoc de ThreadPoolTaskExecutor |
Que la cua s'omple abans que el pool creixi, i quina política de rebuig actua després |
| 4 | Secció «Task Execution and Scheduling» de la referència | Com ho cabla Spring Boot i quan el teu bean substitueix el seu |
Quatre consultes, cinc minuts, i una resposta que no depèn que cap article l'hagi explicada bé.
- El codi font com a documentació
Aquí hi ha el consell amb millor relació esforç/benefici de tota la lliçó: llegeix-te el codi de Spring. És obert, és a GitHub, està raonablement comentat i respon preguntes que cap documentació no respon.
Per què és la millor font. La documentació descriu la intenció; el codi descriu el comportament. Quan alguna cosa no funciona com esperaves, la diferència entre tots dos és exactament on és el teu problema. I a diferència d'un article, el codi mai no està desactualitzat respecte de si mateix.
Tres coses que convé aprendre a llegir:
Les classes d'autoconfiguració. Cercar *AutoConfiguration a l'arbre de spring-boot-autoconfigure i llegir-ne una de sencera —DataSourceAutoConfiguration, JacksonAutoConfiguration o WebMvcAutoConfiguration— desmunta la sensació de màgia de cop. Es veu quines condicions (@ConditionalOnClass, @ConditionalOnMissingBean) activen cada bean, i per tant què has de fer per substituir-lo: gairebé sempre, declarar el teu.
Les classes *Properties. ServerProperties, JpaProperties o DataSourceProperties són la llista exacta i tipada del que es pot configurar, amb els seus valors per defecte als camps. Sol ser més ràpid que buscar a la documentació.
Els spring.factories i AutoConfiguration.imports. El fitxer META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports és literalment la llista de tot el que Spring Boot pot autoconfigurar. Llegir-la una vegada dona una idea de l'abast del framework que cap altra cosa no dona.
# Cercar al teu propi repositori local de Maven, sense sortir de la màquina
find ~/.m2 -name "spring-boot-autoconfigure-*-sources.jar"
./mvnw dependency:sources # descarrega les fonts de totes les dependènciesAmb les fonts descarregades, Ctrl+B sobre qualsevol anotació a l'IDE porta a la seva definició. Aquest és l'hàbit: quan no entenguis per què alguna cosa es comporta així, entra-hi.
- Mantenir-se al dia
El cicle de publicació i el suport
Spring Boot publica una versió menor cada sis mesos (novembre i maig, aproximadament) i correccions cada mes. L'important no és el calendari, sinó la política de suport:
| Tipus | Què inclou | Durada típica |
|---|---|---|
| Suport OSS | Correccions d'errors i de seguretat, de franc | ~12 mesos des de la publicació de la versió menor |
| Suport comercial | Correccions de seguretat més enllà de l'OSS, de pagament | Diversos anys addicionals |
| Fi de vida | Res: ni tan sols pedaços de seguretat | — |
La conseqüència pràctica és dura i convé assumir-la: una aplicació en producció necessita pujar de versió menor almenys una vegada l'any. No és una millora opcional, és manteniment de seguretat. Un projecte que fa tres anys que és a la mateixa versió menor no està «estable»: està acumulant vulnerabilitats conegudes sense pedaç.
L'estratègia sana és pujar aviat i sovint: passar de 3.3 a 3.4 tan bon punt surt i hi ha temps és una feina d'hores; passar de 2.7 a 3.x amb quatre anys de retard és un projecte de setmanes.
On assabentar-se'n
| Font | Què aporta | Freqüència |
|---|---|---|
| Blog oficial de Spring | Publicacions, avisos de seguretat i articles de l'equip | La font primària; subscriu-t'hi |
| This Week in Spring | Resum setmanal de l'ecosistema per l'equip de relacions amb desenvolupadors | Setmanal, es llegeix en cinc minuts |
| Spring Office Hours | Sessió periòdica amb l'equip, amb preguntes reals | Vídeo, per al trajecte |
| InfoQ (Java) | Anàlisi amb perspectiva, no només anuncis | Mensual |
| Notes de versió a GitHub | El detall exacte, amb els canvis incompatibles | Abans de cada actualització |
| Avisos de seguretat de Spring | CVE que t'afecten | Subscripció obligatòria en un projecte real |
L'última fila no és negociable: una vulnerabilitat coneguda en un framework tan estès s'explota massivament al cap de poques hores de publicar-se.
Com llegir unes notes de versió en deu minuts. Tenen sempre la mateixa estructura i convé recórrer-la en aquest ordre: primer «Breaking Changes», que és l'única cosa que et pot trencar i sol ocupar mitja pantalla; després «Deprecations», per saber què has de començar a canviar encara que avui continuï funcionant; després «Dependency Upgrades», on es veu quines versions d'Hibernate, Jackson o Tomcat vénen a dins —i si alguna t'afecta directament—; i per últim «New and Noteworthy», que és la part divertida i la menys urgent. Llegir-les a l'inrevés, començant per les novetats, és el motiu pel qual molta gent s'emporta sorpreses.
- Planificar una actualització de versió major
Pujar d'una versió major a la següent —el cas paradigmàtic és Spring Boot 2.7 → 3.0, amb el salt de javax a jakarta— no és un canvi de número. Aquest és el procediment que funciona.
flowchart LR
A["0. Suite de proves<br/>en verd"] --> B["1. Llegir la guia<br/>de migració"]
B --> C["2. properties-migrator:<br/>corregir el YAML"]
C --> D["3. OpenRewrite:<br/>el que és mecànic"]
D --> E["4. Una versió menor<br/>cada vegada"]
E --> F["5. Revisar el que<br/>el BOM no gestiona"]
F --> G["6. Desplegar a pre<br/>i mesurar"]
E -->|"suite en vermell"| E
Pas 0: tenir proves. Sense la suite del mòdul 6, una actualització major és un salt al buit. Si el projecte no en té, escriure-les és el primer pas de la migració, no una tasca a part.
Pas 1: llegir la guia de migració sencera, abans de tocar res. És al wiki del repositori de Spring Boot i enumera els canvis incompatibles un a un. Mitja hora de lectura estalvia dies.
Pas 2: spring-boot-properties-migrator. Una dependència temporal que, en arrencar, informa de les propietats reanomenades o retirades i aplica temporalment les equivalències:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>Arrenques, llegeixes l'informe del log, corregeixes el YAML i treus la dependència. Deixar-la posada és un error clàssic: emmascara els problemes en lloc de resoldre'ls.
Pas 3: OpenRewrite per al que és mecànic. Les migracions repetitives —javax.* a jakarta.*, anotacions retirades, APIs reanomenades— les fa una recepta automàtica:
./mvnw org.openrewrite.maven:rewrite-maven-plugin:run \
-Drewrite.activeRecipes=org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_3És un canvi massiu, així que va en un commit propi, sense barrejar-hi res, i es revisa llegint la diferència. OpenRewrite fa el 80 % de la feina mecànica; el 20 % restant —el que requereix criteri— continua sent teu.
Pas 4: pujar d'una versió menor cada vegada. De 2.5 a 3.3 no es salta: es va 2.5 → 2.6 → 2.7 → 3.0 → …, amb la suite en verd a cada esglaó. Si alguna cosa es trenca, saps exactament quin esglaó ho va trencar.
Pas 5: revisar el que el BOM no gestiona. Les dependències amb <version> pròpia —a CicloUrbana, JJWT, ShedLock, MapStruct, Resilience4j— no les puja Spring Boot. Són les que queden enrere i les que donen sorpreses.
Pas 6: desplegar a pre i mesurar. Una actualització major pot canviar el rendiment en totes dues direccions. La línia base de k6 del mòdul 9 existeix exactament per a això.
- L'ecosistema Java
Spring Boot viu sobre Java, i des de fa uns anys Java es mou de pressa.
Versions LTS i què aporten. Les versions amb suport estès surten cada dos anys, i són les que es fan servir en producció:
| Versió | Aportacions més rellevants per a una aplicació Spring |
|---|---|
| Java 17 | record, sealed, coincidència de patrons a instanceof, blocs de text, switch com a expressió |
| Java 21 | Fils virtuals, coincidència de patrons a switch, record en patrons, col·leccions seqüenciades |
| Java 25 | Consolidació de les anteriors, millores del recol·lector i d'arrencada |
De tot l'anterior, el que ja fa servir CicloUrbana cada dia són els record dels DTOs, els blocs de text de les consultes JPQL, el switch com a expressió i els fils virtuals.
Project Loom i els fils virtuals. És el canvi conceptual més important de l'última dècada a Java: un fil que en bloquejar-se en entrada/sortida allibera el fil del sistema operatiu en lloc d'ocupar-lo. Per a una aplicació bloquejant amb molta espera de base de dades —que és la immensa majoria de les aplicacions de gestió— permet alta concurrència sense pila reactiva.
// Java 21: un milió de fils que esperen, sense esgotar el sistema operatiu
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 1_000_000).forEach(i ->
executor.submit(() -> { Thread.sleep(Duration.ofSeconds(1)); return i; }));
} // El try-with-resources espera que acabin totes: no cal shutdown()Aquest fragment amb fils de plataforma esgotaria la memòria molt abans d'arribar al milió. Val la pena entendre'l a fons, incloses les seves dues trampes: el pinning amb synchronized i el fet que el límit real passa a ser el pool de connexions, com vam veure a 09-01.
GraalVM i imatges natives. Compilar l'aplicació a un executable natiu redueix l'arrencada de segons a mil·lisegons i la memòria a una fracció. A canvi, la compilació triga minuts, la reflexió necessita RuntimeHints explícits i el rendiment sostingut pot ser una mica menor que amb la JVM. El seu cas clar són les funcions sense servidor i els processos de vida curta; per a un servei que arrenca una vegada al dia, aporta poc.
I una idea de fons: Spring Boot és la part més visible de la teva feina, però la que més es transfereix és Java. Un bon coneixement del llenguatge, de la JVM i de la concurrència sobreviu a qualsevol framework.
- Llibres
Només obres àmpliament reconegudes, amb a qui serveix cadascuna. Un llibre es llegeix en setmanes i es consulta durant anys; és el format amb millor retorn a llarg termini.
| Llibre | Autor | Per a qui i per a què |
|---|---|---|
| Spring in Action | Craig Walls | Recorregut ampli i pràctic de Spring; bon complement d'aquest curs, sobretot per les àrees que no hem tocat |
| Spring Boot: Up and Running | Mark Heckler | Enfocament directe en Boot, amb bones explicacions de l'autoconfiguració |
| Effective Java | Joshua Bloch | El llibre que més millora el teu Java. Noranta elements sobre disseny d'API, genèrics, equals, immutabilitat i concurrència. Si només en llegeixes un, aquest |
| Clean Code | Robert C. Martin | Noms, funcions i comentaris; base del mòdul 10, encara que convé llegir-lo amb criteri propi i no com a dogma |
| Refactoring (2a ed.) | Martin Fowler | El catàleg de transformacions segures; es fa servir com a referència, no es llegeix de seguit |
| Patterns of Enterprise Application Architecture | Martin Fowler | Explica d'on vénen el repositori, el mapejador de dades, la unitat de treball i el model anèmic |
| Domain-Driven Design | Eric Evans | L'original sobre llenguatge ubic, agregats i contextos delimitats. Dens; molts comencen pel següent |
| Implementing Domain-Driven Design | Vaughn Vernon | La versió aplicable de DDD, amb codi |
| Growing Object-Oriented Software, Guided by Tests | Freeman i Pryce | Com les proves guien el disseny; el millor llibre sobre el «per què» de TDD |
| Unit Testing: Principles, Practices, and Patterns | Vladimir Khorikov | Què provar i què no, i per què verificar interaccions produeix proves fràgils |
| High-Performance Java Persistence | Vlad Mihalcea | La referència sobre JPA i Hibernate de debò: N+1, identificadors, bloqueigs, lots, memòria cau |
| Designing Data-Intensive Applications | Martin Kleppmann | Replicació, particionat, consistència i transaccions distribuïdes. Imprescindible abans de partir un sistema |
| Building Microservices (2a ed.) | Sam Newman | Honest sobre els costos; el llibre que cal llegir abans de decidir dividir |
| Site Reliability Engineering | Diversos (Google) | SLI, SLO, pressupostos d'error i guàrdies. Gratuït en línia |
| Observability Engineering | Majors, Fong-Jones i Miranda | El marc conceptual darrere del mòdul 9 |
| Accelerate | Forsgren, Humble i Kim | La recerca darrere de les mètriques DORA del mòdul 8 |
| The Pragmatic Programmer | Hunt i Thomas | Ofici i actitud, més enllà de qualsevol tecnologia |
Si n'haguessis de triar tres per als propers sis mesos, partint d'on ets: Effective Java (et fa millor programador Java, no millor usuari de Spring), High-Performance Java Persistence (perquè la base de dades és on és el temps) i Designing Data-Intensive Applications (perquè és el que amplia la visió més enllà d'una aplicació).
- Certificacions
La certificació de referència de l'ecosistema és la VMware Spring Professional, que cobreix contenidor, AOP, dades, MVC, seguretat, Boot i proves: aproximadament el temari d'aquest curs.
Una valoració honesta:
| A favor | En contra |
|---|---|
| Dona una estructura i una data límit, cosa que a molta gent li ordena l'estudi | Costa diners i diverses setmanes de preparació |
| Obliga a cobrir àrees que un evita | Premia memoritzar detalls que es consulten en un segon |
| En alguns mercats i consultores, filtra currículums | Ningú amb experiència no contracta per una certificació |
| El temari està ben triat | Caduca: l'ecosistema es mou més ràpid que l'examen |
Quan compensa, en concret: si treballes en una consultora on influeix en l'assignació de projectes o en la tarifa; si la teva empresa la paga i et dona temps; o si necessites una estructura externa per estudiar de manera consistent. Quan no: si l'objectiu és demostrar que en saps. Per a això, un projecte públic ben fet —amb proves, canonada i README decent— diu moltíssim més, i és el que de debò es mira en una entrevista tècnica.
Existeixen a més certificacions adjacents que en molts contextos valen més que la de Spring: les de Kubernetes (CKA i CKAD) i les dels proveïdors de núvol, perquè cobreixen una àrea on la demanda supera amb claredat l'oferta i on l'examen és pràctic, amb una terminal de debò, en lloc d'una bateria de preguntes. Si l'objectiu és l'ocupabilitat i ja saps Spring Boot, aquesta direcció sol ser millor inversió.
- Comunitat
| Lloc | Per a què serveix | Com aprofitar-lo |
|---|---|---|
Stack Overflow (etiquetes spring-boot, spring-data-jpa) |
Preguntes concretes ja resoltes | Mira la data i la versió de les respostes; i filtra per vots, no per acceptació |
| Rastrejador d'incidències de Spring (GitHub) | Saber si «això rar» és un error conegut | Cercar el missatge d'error literal abans de preguntar enlloc |
| Discussions de GitHub dels projectes | Preguntes de disseny respostes per l'equip | Molt infrautilitzat |
| SpringOne | La conferència de l'ecosistema; xerrades de l'equip | Els enregistraments són gratuïts |
| Devoxx, Codemotion, JavaZone | Java i ecosistema en general | Devoxx publica gairebé tot en obert |
| Grups locals de Java (JUG) | Xerrades i contactes a la teva ciutat | El valor real és a la conversa posterior, no a la xerrada |
I el consell sobre preguntar, que serveix en qualsevol d'aquests llocs: una bona pregunta inclou la versió de Spring Boot, un exemple mínim que reprodueixi el problema, el missatge d'error complet i el que ja has intentat. Preparar aquesta pregunta resol el problema per si sola una de cada tres vegades, i el fenomen té nom —rubber duck debugging—: l'obligació d'explicar el problema amb precisió et fa veure el forat del teu raonament.
Sobre el rastrejador d'incidències, que mereix un paràgraf propi perquè gairebé ningú no el fa servir: quan Spring fa alguna cosa que no entens, hi ha una probabilitat alta que algú ja ho hagi reportat, i que un membre de l'equip hagi explicat per què funciona així. Aquestes respostes són sovint millors que la documentació, perquè responen la pregunta exacta que tu tens. Cercar el missatge d'error literal entre cometes és el primer moviment, abans d'escriure en cap fòrum.
- Pràctica deliberada
Llegir sobre programació no ensenya a programar, igual que llegir sobre natació no ensenya a nedar. Quatre maneres de practicar que sí que funcionen:
Projectes propis de dificultat creixent. L'error habitual és començar per «una xarxa social»: massa gran, s'abandona la setmana tres. Una progressió que funciona:
| Nivell | Projecte | Què t'obliga a resoldre |
|---|---|---|
| 1 | Un CRUD amb autenticació i proves, desplegat | Tot el flux, de principi a fi. Sona poc i no ho és |
| 2 | Afegir-hi una integració externa amb tallacircuits i memòria cau | Fallades parcials, temps d'espera, invalidació |
| 3 | Afegir-hi feina en segon pla i notificacions | Concurrència, idempotència, lliurament |
| 4 | Sotmetre'l a una prova de càrrega i optimitzar-lo fins a un SLO | Mesurar, perfilar, decidir |
| 5 | Extreure'n una part a un servei a part, amb missatgeria | Consistència eventual, contractes, traçabilitat |
Les set extensions de 10-04 cobreixen exactament aquesta progressió sobre un projecte que ja coneixes.
Contribuir a un projecte lliure. Comença per documentació o per una incidència etiquetada com a bona per començar. El que s'aprèn no és tant el codi com el procés: revisions exigents, proves obligatòries, discussions de disseny en obert. És la manera més barata de treballar amb gent millor que tu.
Katas i exercicis curts. Repetir un problema petit concentrant-te en una cosa cada vegada —aquesta vegada amb TDD, aquesta vegada sense if, aquesta vegada amb noms perfectes— és el més semblant a practicar escales. Mitja hora a la setmana.
Llegir codi aliè. L'hàbit més infravalorat. Tria un projecte Spring Boot ben valorat a GitHub i llegeix-lo com es llegeix un llibre: l'estructura de paquets, un servei, les seves proves, la seva canonada. Hi trobaràs decisions diferents de les d'aquest curs, i entendre per què les van prendre és més formatiu que estar-hi d'acord.
I un advertiment sobre les tres primeres: la pràctica sense retroalimentació no és pràctica deliberada, és repetició. Escriure codi que ningú no revisa consolida tant els encerts com els errors. Les tres fonts de retroalimentació disponibles, de més a menys accessible, són: les proves, que et diuen si funciona; les eines de 10-03 —ArchUnit, SpotBugs, l'anàlisi estàtica—, que et diuen si està ben construït; i una persona, que és l'única que et diu si està ben pensat. Si treballes sol, contribuir a un projecte lliure és la manera més barata d'aconseguir la tercera.
- Temes naturals per al pas següent
Tots aquests parteixen d'alguna cosa que ja saps. La tercera columna és la que importa: diu quina lliçó et va deixar preparat.
| Tema | Què és | Què del curs t'hi prepara |
|---|---|---|
| Spring Modulith | Mòduls amb fronteres verificades dins del monòlit, amb esdeveniments i proves per mòdul | Els paquets per funcionalitat de 01-04 i les regles d'ArchUnit de 10-03 |
| Missatgeria amb Kafka o RabbitMQ | Comunicació asíncrona duradora entre sistemes | El límit de @Async a 07-03 i els esdeveniments de 04-07 |
| Spring Batch | Processos per lots amb reinici, reintents i fragmentació | Les tasques programades de 07-03 i l'importador amb TransactionTemplate de 04-07 |
| WebFlux i R2DBC | Pila reactiva no bloquejant | El model de fils de 09-01. Amb un advertiment: els fils virtuals de Java 21 cobreixen avui bona part del seu cas d'ús amb molta menys complexitat |
| Arquitectura hexagonal | Ports i adaptadors; el domini al centre | La regla de dependència de 10-01 i el domini sense framework de 10-03 |
| DDD tàctic | Agregats, objectes de valor, esdeveniments de domini, repositoris | La discussió del model anèmic de 10-03 i els esdeveniments de 02-02 |
| Kubernetes en profunditat | Operadors, malles de servei, polítiques de xarxa, GitOps | Els manifestos i Helm de 08-04 |
| Spring AI | Integració amb models de llenguatge des de Spring | El patró de client extern amb tolerància a fallades de 07-06 |
| OAuth2 i OpenID Connect | Delegar la identitat en un proveïdor | El JWT propi de 05-04, que és la versió artesanal del mateix problema |
Quin triar primer. No el que més soni, sinó el que resolgui un problema que tinguis. Si la teva aplicació perd feina quan es reinicia, missatgeria. Si dos equips es trepitgen al mateix codi, Spring Modulith. Si el domini se't dilueix en els serveis, DDD tàctic. I si res no et fa mal encara, l'ordre que millor consolida el que has après és Spring Modulith → missatgeria → DDD tàctic.
- Com avaluar un recurs
Tres preguntes, en aquest ordre, abans d'invertir temps en un article, un vídeo o un curs:
1. De quan és? Si no hi ha data visible, desconfia. Un article sense data sobre un framework que publica dues versions l'any no és un recurs, és un risc.
2. Quina versió de Spring Boot fa servir? És la pregunta decisiva, i gairebé sempre es respon mirant el codi en deu segons:
| Senyal | Què indica |
|---|---|
javax.persistence, javax.servlet, javax.validation |
Spring Boot 2: el salt a Jakarta EE 9+ va reanomenar tots aquests paquets a Boot 3 |
WebSecurityConfigurerAdapter |
Spring Security 5: retirat, substituït per SecurityFilterChain |
@EnableGlobalMethodSecurity |
Ídem: avui és @EnableMethodSecurity |
spring-cloud-starter-sleuth |
Descontinuat: avui és Micrometer Tracing |
WebMvcConfigurerAdapter, @MockBean |
Adaptador retirat; @MockBean substituït per @MockitoBean a Boot 3.4+ |
RestTemplate com a recomanació |
No està retirat, però des de Boot 3.2 l'opció per defecte és RestClient |
application.properties amb spring.datasource.initialize |
Propietats de Boot 1.x |
Per què un tutorial de Spring Boot 2 confon més del que ajuda. No és que estigui «una mica antiquat»: és que el codi no compila en un projecte Boot 3 —canvien els paquets de totes les anotacions de persistència, validació i servlet— i, pitjor, l'explicació conceptual continua sent plausible. El lector novell no distingeix entre «això ja no existeix» i «això ho he escrit malament», i perd hores. Amb la taula anterior, aquests deu segons de comprovació t'estalvien la tarda.
3. Qui el signa i què s'hi juga? Un article de l'equip de Spring, d'un autor amb trajectòria o d'un projecte amb revisió entre iguals té un incentiu per estar bé. Un contingut optimitzat per a posicionament, no.
I un quart criteri que s'aplica sobretot al contingut generat automàticament, cada vegada més abundant: si el codi no es pot executar tal com és, sospita. Els exemples que barregen versions, inventen mètodes que no existeixen o criden APIs de dues èpoques diferents són la firma característica.
- Un full de ruta de sis mesos
Una proposta concreta i raonada per a qui acaba aquest curs i vol consolidar en lloc de dispersar-se. El principi que l'ordena: cada mes té un lliurament, i cada lliurament es recolza en l'anterior.
| Mes | Focus | Lliurament concret |
|---|---|---|
| 1 | Consolidar el que s'ha après. Res de nou | Implementar dues extensions de 10-04: el panell d'operari i els informes amb exportació. Amb proves i desplegat |
| 2 | Java, no Spring. Effective Java | Refactoritzar el projecte aplicant deu elements concrets del llibre; escriure què va millorar i què no |
| 3 | Persistència de debò. High-Performance Java Persistence | Prova de càrrega amb dades realistes, EXPLAIN ANALYZE sobre les cinc consultes més cares, índexs i una millora mesurada de p95 |
| 4 | Missatgeria. Kafka o RabbitMQ amb Spring | Extreure les notificacions a un consumidor de missatges, amb patró outbox, idempotència i traces que creuin la frontera |
| 5 | Disseny. Spring Modulith i DDD tàctic | Reorganitzar el projecte en mòduls amb fronteres verificades i esdeveniments entre ells; moure al domini les regles que avui viuen en serveis |
| 6 | Producció de debò. SRE i observabilitat | Definir SLO amb pressupost d'error, alertes sobre símptomes, quadre de comandament i un assaig d'incident cronometrat |
Per què aquest ordre i no un altre. El mes 1 no aprèn res de nou expressament: el que s'acaba de veure es consolida fent-ho servir, no afegint-hi temes a sobre. El mes 2 és Java i no Spring perquè és el que més es transfereix i el que menys caduca. El mes 3 ataca on de debò és el temps. El 4 i el 5 són els dos salts conceptuals —comunicació asíncrona i disseny de domini— i van després de tenir la base sòlida. I el 6 tanca el cicle, perquè operar el que un construeix és el que converteix un programador en un enginyer.
Com fer-lo realista. Quatre o cinc hores a la setmana, amb un lliurament visible cada mes. Un pla de vint hores setmanals no es compleix i produeix culpa; un de cinc hores mantingut sis mesos produeix un canvi real. I si algun mes no surt, no se salta: es retarda. La seqüència importa més que el calendari.
I si la teva situació és una altra, adapta'l amb aquest criteri en lloc de copiar-lo. Si estàs buscant feina, mou el mes 6 al principi: un projecte desplegat i observable és el que s'ensenya en una entrevista. Si el teu equip partirà el monòlit el trimestre vinent, avança el mes 4 i afegeix Designing Data-Intensive Applications. Si acabes d'entrar en un projecte heretat, els mesos 1 i 2 se substitueixen per escriure proves de caracterització i actualitzar la versió, que és el que desbloqueja tota la resta. El full de ruta correcte és el que ataca el problema que tens avui, no el que cobreix més temes.
Errors Comuns i Consells
Col·leccionar recursos en lloc de fer-los servir. Cinquanta pestanyes obertes i tres cursos començats produeixen la sensació d'estar aprenent i cap aprenentatge. Un recurs cada vegada, amb un problema al davant.
Seguir un tutorial sense comprovar la versió. És la causa número u d'hores perdudes amb Spring. Deu segons mirant si diu javax o jakarta te les estalvien.
Aprendre el que és nou abans de dominar l'actual. WebFlux, GraalVM o Spring AI són interessants; si encara no tens clar com funciona el proxy de @Transactional, no són el teu pas següent.
Copiar configuració sense entendre-la. Un application.yml copiat d'un blog porta propietats que no necessites, algunes perilloses —ddl-auto: update, Actuator obert, show-sql actiu— i cap explicació.
Confondre «he llegit sobre això» amb «sé fer això». La prova és senzilla i és implacable: obrir l'IDE i fer-ho sense mirar.
Acceptar sense verificar el codi que suggereix un assistent. Els models de llenguatge s'entrenen amb tot el que hi ha publicat, i el que hi ha publicat sobre Spring Boot és majoritàriament de l'era 2.x: veuràs WebSecurityConfigurerAdapter, javax.persistence i @MockBean amb una seguretat absoluta. Són eines excel·lents per explorar i per escriure el que és repetitiu, i s'hi apliquen exactament els mateixos criteris de l'apartat 12: comprova la versió, executa'l i no l'enganxis si no l'entens.
Estudiar només el que ja t'agrada. És còmode aprofundir en el que un domina i evitar el que li resulta aliè —per a molts programadors, l'operació i la base de dades—. I és justament aquí on sol ser la diferència més gran entre el que saps i el que el projecte necessita.
Consell: escriu el que aprens. Un article, una nota interna o un fitxer docs/decisions/ al teu projecte. Explicar alguna cosa obliga a entendre-la de debò, i descobreix els forats que la lectura passiva amaga.
Consell: mantén un projecte viu. Un repositori propi al qual tornes cada poques setmanes val més que deu cursos. És on provar cada cosa nova i on comprovar si funciona a les teves mans i no només a les de l'autor.
Consell: aprèn a llegir codi abans que a escriure'l. La major part de la teva carrera la passaràs llegint: el codi del teu equip, el d'un framework, el d'algú que se'n va anar fa tres anys. És una habilitat que s'entrena, i gairebé ningú no l'entrena expressament.
Consell: quan alguna cosa et sorprengui, atura't i entra-hi. Aquell instant de «vaja, no sabia que feia això» és el millor senyal d'aprenentatge disponible, i es malbarata gairebé sempre perquè hi ha pressa. Deu minuts llegint la classe que ho provoca valen més que dues hores d'un curs sobre alguna cosa que no t'ha sorprès mai.
Consell: la millor manera d'estudiar un tema nou és escriure l'exemple més petit possible. No un projecte: un mòdul Maven de tres classes que fa una cosa. Un consumidor de Kafka que imprimeix missatges. Un @Observed que produeix un span. És ràpid d'escriure, ràpid de llençar, i contesta preguntes que cap article no contesta.
Exercicis
Exercici 1: avaluar tres recursos
Cerca tres articles o tutorials sobre «Spring Boot JWT authentication» en qualsevol cercador. Per a cadascun, aplica els criteris de l'apartat 12 i redacta una fitxa amb: data, versió de Spring Boot deduïda i amb quin senyal concret l'has deduïda, si el codi compilaria avui, tres coses que faries diferent segons el que has après al mòdul 5, i el teu veredicte final. És molt probable que almenys un estigui desactualitzat; l'exercici consisteix a detectar-ho en menys d'un minut.
Exercici 2: llegir una classe d'autoconfiguració
Descarrega les fonts amb ./mvnw dependency:sources i obre DataSourceAutoConfiguration (o JacksonAutoConfiguration, si prefereixes alguna cosa més curta). Respon: quines condicions s'han de complir perquè s'activi? quins beans declara? quina anotació fa que el teu propi bean guanyi el seu? de quina classe *Properties llegeix la configuració i quins valors per defecte té? I per últim: què hauries de fer per substituir completament el seu DataSource per un de teu?
Exercici 3: el teu propi full de ruta
Adapta el full de ruta de l'apartat 13 a la teva situació real. Parteix de tres preguntes: quin problema tens avui a la teva feina o al teu projecte que Spring Boot encara no t'ha resolt?, quantes hores a la setmana pots sostenir de debò durant sis mesos?, i quin lliurament visible marcaria cada mes? Escriu el resultat amb un lliurament per mes i un criteri objectiu per saber si l'has complert.
Solucions
Solució 1
Un exemple de fitxa ben feta, sobre un cas molt habitual:
Article A — Sense data visible (primer senyal d'alarma; al peu del blog apareix 2021). Versió deduïda: Spring Boot 2.5. Senyals, per ordre de contundència: estén
WebSecurityConfigurerAdapteri sobreescriuconfigure(HttpSecurity), retirat a Spring Security 5.7; importajavax.servlet.FilterChain; fa servirantMatchers(...), substituït perrequestMatchers(...); iio.jsonwebtoken0.9.1, l'APIJwts.parser().setSigningKey(String)de la qual ja no existeix a 0.12. Compilaria avui? No. Fallaria alsimportdejavax.*i a la classe base retirada, i ni tan sols arribaria als errors de l'API de JJWT. Tres coses que faria diferent segons el mòdul 5: (1)SecurityFilterChaincom a bean en lloc de l'adaptador, ambauthorizeHttpRequestsacabat enanyRequest().denyAll(); (2) el secret per variable d'entorn i de 256 bits, no una constant"secret"al codi; (3) token d'accés de quinze minuts amb refresc rotatori, en lloc de les deu hores de l'article. Veredicte: descartar. No per antic, sinó perquè l'error que ensenya és de seguretat, que és la pitjor categoria per copiar sense entendre.
Els tres senyals que resolen el 90 % dels casos en deu segons: javax enfront de jakarta, WebSecurityConfigurerAdapter, i spring-cloud-starter-sleuth. Si apareix qualsevol dels tres, el recurs és de l'era Spring Boot 2.
I el matís que evita ser injust: un recurs antic pot continuar sent conceptualment correcte. L'explicació de què és un JWT, per què se signa i per què la seva càrrega útil és llegible no ha canviat. El que no es pot copiar és el codi.
Solució 2
Sobre DataSourceAutoConfiguration, les respostes i —més important— el que ensenya cadascuna:
Quines condicions l'activen? @ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class}), és a dir, només si aquestes classes són al classpath. D'aquí la regla que explica tota l'autoconfiguració: afegir un starter de dades no «encén» res màgicament; simplement posa classes al classpath i les condicions es compleixen.
Quins beans declara? Un DataSource, resolt en configuracions imbricades: si detecta HikariCP el fa servir (@ConditionalOnClass(HikariDataSource.class)), i si no prova amb Tomcat JDBC o DBCP2, en aquest ordre. També declara DataSourceInitializer i els beans de propietats.
Què fa que el teu bean guanyi? @ConditionalOnMissingBean. És l'anotació clau de tot Spring Boot: l'autoconfiguració només actua si tu no has decidit res. Declarar el teu propi @Bean DataSource la desactiva sense necessitat d'excloure res.
D'on llegeix? De DataSourceProperties (prefix spring.datasource), on hi ha url, username, password, driverClassName, generate-unique-name i la resta, amb els seus valors per defecte escrits als camps —cosa més ràpida de consultar que la documentació—.
Com substituir-lo del tot? Tres maneres, de millor a pitjor: declarar el teu propi @Bean DataSource, que guanya per @ConditionalOnMissingBean; excloure-la amb @SpringBootApplication(exclude = DataSourceAutoConfiguration.class); o treure la dependència, amb la qual cosa la condició de classe deixa de complir-se.
El que l'exercici ensenya de debò no és aquesta classe, sinó el patró: @ConditionalOnClass + @ConditionalOnMissingBean + una classe *Properties. Amb això entens les dues-centes autoconfiguracions restants, inclosa la de l'starter propi que vam escriure a 02-06. I confirma l'afirmació de l'apartat 3: quan llegeixes el codi, la màgia desapareix.
Solució 3
No hi ha solució única, però sí una manera reconeixible d'haver fet bé l'exercici. Un exemple:
Situació: treballo en un equip de quatre persones amb un monòlit Spring Boot 2.7 que ningú no gosa actualitzar. Puc sostenir quatre hores a la setmana. El problema real no és tècnic: és que no hi ha proves i per això ningú no toca res.
Mes Focus Lliurament Criteri objectiu 1 Proves de caracterització dels tres fluxos crítics Suite que s'executa a CI ./mvnw verifyen verd a la canonada, no al meu portàtil2 Actualització a Spring Boot 3, esglaó a esglaó Branca amb 2.7 → 3.0 → 3.3La suite del mes 1 en verd a cada esglaó 3 Effective Java + refactorització d'un mòdul Mòdul de facturació net Deu elements aplicats, documentats a docs/decisions/4 Rendiment: k6, EXPLAIN ANALYZE, índexsLínia base i una millora mesurada p95 de l'endpoint pitjor per sota de 300 ms 5 Observabilitat: mètriques, logs i traces Quadre de comandament i dues alertes Provocar un incident i diagnosticar-lo en menys de deu minuts 6 Spring Modulith Fronteres entre facturació i comandes Regles d'ArchUnit que fallen si algú les creua
El que fa bo aquest full de ruta: el mes 1 no és «aprendre alguna cosa», és treure el bloqueig real —sense proves no es pot fer res de la resta—; cada mes té un criteri objectiu i verificable, no «entendre X»; l'ordre respecta les dependències entre temes; i les hores són les que la persona pot sostenir de debò, no les que li agradaria.
L'error típic en fer aquest exercici és escriure una llista de tecnologies que sonen bé —Kafka, Kubernetes, WebFlux, GraalVM— sense cap problema al darrere. Un full de ruta sense un problema a resoldre s'abandona la setmana cinc.
I una comprovació final que convé fer-se: si d'aquí a sis mesos complissis el pla sencer, què sabries fer que avui no saps? Si la resposta es pot formular amb verbs —«actualitzar un projecte heretat sense por», «diagnosticar un p99 alt en deu minuts»— el pla és bo. Si només es pot formular amb substantius —«Kafka», «Kubernetes»—, encara és una llista de temes i no un full de ruta.
Conclusió
Aquí s'acaba el curs, i convé mirar el camí complet abans de tancar-lo.
Vam començar a 01-03 amb un @RestController de nou línies que retornava quatre estacions escrites a mà i un curl que responia a localhost:8080. Acabem amb CicloUrbana: una aplicació amb un contracte REST versionat i documentat, amb els seus DTOs, la seva validació i els seus errors en RFC 7807; amb persistència sobre PostgreSQL governada per nou migracions de Flyway i transaccions que garanteixen que cap bicicleta de Ribalta no quedi bloquejada a mitges; amb autenticació JWT, jerarquia de rols i regles de seguretat que depenen de la dada i no només de la ruta; amb una suite de proves que va de la unitat d'un mil·lisegon al flux complet sobre un PostgreSQL real i efímer; amb tasques programades coordinades entre rèpliques i feina asíncrona que no bloqueja el ciutadà; empaquetada en una imatge multietapa, desplegada a Kubernetes per una canonada que la construeix, l'escaneja i la promociona sola; i observada d'extrem a extrem, on la mètrica detecta, la traça localitza i el log explica, units per un mateix rastreId. I amb el criteri, al final, per saber per què està feta així i on caldria trencar cada regla.
L'important és que gairebé res d'això no és específic de Spring Boot. La inversió de control, la separació entre domini i contracte, l'atomicitat d'un cas d'ús, la denegació per defecte, la piràmide de proves, mesurar abans d'optimitzar, els percentils en lloc de la mitjana, les migracions compatibles cap enrere, un artefacte per a tots els entorns, els secrets fora del repositori, els logs estructurats i correlacionats, el deute tècnic registrat amb el seu cost: tot això viatja amb tu a qualsevol framework, a qualsevol llenguatge i a qualsevol equip. Spring Boot ha estat el vehicle; el que has après a conduir és més gran.
Queden coses per saber, i sempre en quedaran. És la part incòmoda i també la millor d'aquest ofici: ningú no acaba d'aprendre'l, i la diferència entre algú amb dos anys d'experiència i algú amb quinze no és el nombre de frameworks que coneix, sinó la qualitat de les preguntes que es fa abans de decidir. Aquest curs ha intentat, sobretot, ensenyar-te aquestes preguntes: quin problema resol això?, què em costa?, com sabré si funciona?, què passa quan falli?, ho entendrà el proper que ho llegeixi?
Ara et toca a tu. Agafa CicloUrbana i porta-la a algun lloc: afegeix-hi les tarifes dinàmiques, extreu-ne la facturació, connecta-la a un mapa. O comença alguna cosa teva, més petita i més real, i fes-la bé de principi a fi. El que no funciona és esperar a saber-ho tot abans de construir: s'aprèn construint, mesurant el que es construeix i arreglant el que es trenca.
La xarxa de Ribalta està en marxa. Gràcies per arribar fins aquí, i bon viatge.
Curs de Spring Boot
Mòdul 1: Introducció a Spring Boot
- Què és Spring Boot?
- Configuració del teu entorn de desenvolupament
- Creant la teva primera aplicació Spring Boot
- Entenent l'estructura del projecte
- L'arrencada i el cicle de vida de l'aplicació
Mòdul 2: Conceptes bàsics de Spring Boot
- Anotacions de Spring Boot
- Injecció de dependències a Spring Boot
- Àmbit i cicle de vida dels beans
- Configuració de Spring Boot
- Propietats de Spring Boot
- Autoconfiguració i starters per dins
Mòdul 3: Construint serveis web RESTful
- Introducció als serveis web RESTful
- Creant controladors REST
- Gestió dels mètodes HTTP
- Validació de dades d'entrada
- DTOs i mapatge entre capes
- Gestió d'excepcions a REST
- Documentar l'API amb OpenAPI
Mòdul 4: Accés a dades amb Spring Boot
- Introducció a Spring Data JPA
- Configuració de fonts de dades
- Creació d'entitats JPA
- Relacions entre entitats
- Ús de repositoris de Spring Data
- Mètodes de consulta a Spring Data JPA
- Transaccions i gestió de la persistència
- Migracions d'esquema amb Flyway
Mòdul 5: Seguretat a Spring Boot
- Introducció a Spring Security
- Configuració de Spring Security
- Autenticació i autorització d'usuaris
- Implementació d'autenticació JWT
- Seguretat a nivell de mètode i enduriment de l'API
Mòdul 6: Proves a Spring Boot
- Introducció a les proves
- Proves unitàries amb JUnit
- Simulació amb Mockito
- Proves d'integració
- Proves amb Testcontainers
Mòdul 7: Funcions avançades de Spring Boot
- Spring Boot Actuator
- Perfils de Spring Boot
- Tasques programades i execució asíncrona
- Spring Boot amb Docker
- Spring Boot i microserveis
- Comunicació entre serveis i tolerància a fallades
Mòdul 8: Desplegament d'aplicacions Spring Boot
- Introducció al desplegament
- Desplegant a Heroku
- Desplegant a AWS
- Desplegant a Kubernetes
- Integració i lliurament continus
Mòdul 9: Rendiment i monitoratge
- Ajust de rendiment
- Memòria cau amb Spring Cache
- Monitoratge amb Spring Boot Actuator
- Ús de Prometheus i Grafana
- Gestió de registres i logs
- Traçabilitat distribuïda
