Java 25 · Spring Boot 4 · en idé under utveckling

Tänk om vi behövde färre ramverk?

En tanke om beroenden, Spring Boot och vad Java 25 redan ger oss

Vi har blivit riktigt bra på att lägga till bibliotek. Jag har börjat undra om nästa förbättring kan vara att ta bort några – utan att göra systemet dummare, farligare eller svårare att drifta. Det här är ett resonemang, inte en slutsats.

Färre beroenden?Mer vanlig JavaSpring där det ger värdeMindre att förvalta
Abstrakt visualisering av många tekniska lager som skalas av mot en enkel kärna.

Under många år har Java-utveckling ofta betytt att vi lägger till ett ramverk eller bibliotek så fort ett nytt behov uppstår. Det har varit rationellt, och jag har gjort likadant. Men Java-plattformen har vuxit, språket har blivit bättre och priset för mekanisk kod har sjunkit. Därför har jag börjat fundera på en fråga jag inte har ett färdigt svar på: hur mycket av det vi brukar lägga till behöver vi fortfarande?

01 · Tanken

Det här handlar inte om att Spring är problemet

Spring Boot löser många svåra problem, och gör det bra. För publika API:er, säkerhet, avancerad routing, observability och stora integrationsytor är Spring antagligen fortfarande det billigaste alternativet totalt sett.

Men Spring har blivit så självklart att jag misstänker att vi ibland når efter det även när problemet är mindre än lösningen. Det är den misstanken jag vill undersöka här.

En liten intern tjänst behöver kanske bara några HTTP-anrop, en databas, ett utgående anrop och lite affärslogik. I Java 25 finns redan HTTP-klient, JDBC, schemaläggning, records, loggning, JFR/JMX och moderna samtidighetsverktyg. Virtuella trådar gör dessutom vanlig, blockerande kod betydligt mer attraktiv för I/O än den var för några år sedan.

Java har inte blivit ett nytt Spring. Men kanske har gränsen för vad som behöver ett ramverk flyttat sig lite?
Abstrakt nätverksdiagram där en tydlig kärna kopplas till ett begränsat antal yttre system.
En målbild jag tycker är tilltalande: en tydlig kärna och ett litet antal medvetna gränser mot omvärlden.

02 · Förvaltningsytan

Kanske är beroenden lite av ett isberg

När vi tittar på en pom.xml eller build.gradle ser vi bara en del av systemets tekniska yta. Under den finns transitiva bibliotek, versionskopplingar, autokonfiguration, proxyer, annotation processing och konventioner som någon behöver förstå den dagen något går fel.

Att räkna JAR-filer känns därför som ett trubbigt mått. En liten extern dependency kan vara mycket billig. Fyrahundra rader egen OAuth-kod kan vara mycket dyr.

Med minimalism menar jag alltså inte minst kod eller noll bibliotek. Snarare mindre onödig semantik – mindre teknik som teamet behöver bära över tid.

Isberg där en liten synlig topp representerar direkta beroenden och en mycket större struktur under ytan representerar den dolda förvaltningsytan.
Direkta dependencies är den synliga delen. Min känsla är att förvaltningskostnaden ofta sitter i allt som följer med.
VersionerUppgraderingar, kompatibilitet och koordinering.
SäkerhetCVE:er, parser- och nätverksyta, patcharbete.
SemantikDolda regler, proxybeteenden och lifecycle.
FörändringHur mycket behöver förstås nästa gång kraven flyttar sig?

03 · Ett förslag på ordning

Tänk om vi frågade i den här ordningen?

I stället för att börja med frågan “vilket bibliotek ska ersätta detta?” skulle man kunna gå igenom fyra steg. Ju längre åt höger vi kommer, desto mer specialiserad semantik väljer vi att låta någon annan äga. Ordningen är ingen sanning – mest ett sätt att göra valet medvetet.

1. Behövs det?Behövs beteendet över huvud taget? En cache eller intern event-bus som aldrig byggs har ingen implementation att förvalta.
2. Finns det i JDK?Finns en direkt och tillräcklig lösning i Java 25? Till exempel HTTP-klient, filer, Base64, scheduling.
3. Räcker lite egen kod?Är semantiken enkel och lokal? Mappning, konfiguration, en liten retry-loop eller en composition root kan bli ganska tydlig vanlig Java.
4. Låt specialisten ta detHandlar det om JSON, OAuth/OIDC, anslutningspool, brokerprotokoll eller avancerad telemetry? Då tror jag ett moget bibliotek nästan alltid är billigare.

04 · Var Spring kanske passar bäst

Tänk om Spring fick bo vid kanten?

Den idé jag själv tycker är mest intressant handlar inte om att ta bort Spring Boot. Den handlar om att kanske sluta låta Spring vara applikationens huvudsakliga programmeringsmodell.

Min tanke är att om kärnan är fri från Spring blir nästa beslut mindre dramatiskt. En komplex tjänst kan lugnt stanna på avskalat Boot. En liten intern tjänst skulle senare kunna gå längre mot ren JDK. En batch eller worker behövde kanske aldrig Spring från början. Men det är just en tanke – jag vet inte hur väl den håller i era system.

05 · Några saker jag är nyfiken på

Allt behöver nog inte behandlas lika

Kanske enklare idag

Lombok och mappare

Records och explicit kod gör att en del av den mekaniska hjälpen känns mindre värdefull än den gjorde tidigare.

JDK räcker ofta

Utgående HTTP

JDK HttpClient verkar räcka långt för vanlig service-to-service-kommunikation.

Beror på tjänsten

Spring DI

Konstruktorinjektion behöver ingen container. Samtidigt kan en stor och dynamisk objektgraf mycket väl motivera Spring.

Värt att titta på

JPA / Hibernate

För tydlig SQL och en begränsad modell kan JDBC vara enklare. För rika objektgrafer är ORM antagligen fortfarande billigare.

Här skulle jag behålla

JSON och säkerhet

Generell JSON-parsning och OAuth/OIDC bär på svår semantik som sällan bör bli egen infrastruktur.

Här skulle jag behålla

Connection pool

JDBC finns i JDK, men en produktionsmässig pool gör det inte. HikariCP känns som ett självklart kvarvarande beroende.

06 · Vad skulle vi vinna?

Om det stämmer handlar det om förvaltningskostnad

Det som skulle göra idén värd något är inte ett snyggare dependency tree. Det är om teamet över flera år får mindre teknik att koordinera, färre lager att förstå och mindre påverkan när plattformen uppgraderas. Och det är förstås ett antagande som behöver prövas.

Om vi minskar…Skulle vi kanske få…Men bara om…
Externa dependency familiesFärre separata versions- och uppgraderingsspårVi inte ersätter dem med stora interna ramverk
Spring-typer i domänenMindre påverkan av ramverksuppgraderingar och enklare testerGränserna mellan kärna och adapters är tydliga
Runtime-magiSynligare kontrollflöde och enklare felsökningDen explicita koden förblir liten och begriplig
Överdriven standardisering i kodMindre lokal infrastrukturOrganisationen fortfarande standardiserar viktiga kontrakt och driftbeteenden

07 · En sak som kan ha ändrats

Mer kod kan ibland betyda mindre system

AI gör det billigare att skapa mekaniska mappare, JDBC row-mappers, config records, adapters, tester och repetitiva decorators. Om det stämmer minskar värdet av abstraktioner vars viktigaste bidrag är att vi slipper skriva några rader.

Samtidigt gör AI knappast protokoll, kryptografi, parsergränsfall, concurrency eller transaktionssemantik mindre farliga. Det går snabbt att generera en anslutningspool. Det betyder inte att teamet borde äga en.

Lite mer synlig kod skulle kunna ge ett betydligt mindre system.

08 · Så här långt har jag kommit

Kanske handlar minimalism mest om att välja ansvar

Jag ser ingen poäng i att göra “noll Spring” till en trosbekännelse. Däremot tror jag att det finns något i att göra varje dependency medveten.

En liten tjänst skulle kanske klara sig på JDK:s HTTP-server. En komplex publik tjänst kan gott stanna på WebMVC och Spring Security. En worker kan kanske vara nästan ren Java. Det gemensamma vore att affärslogiken får vara vanlig Java och att specialistbibliotek hålls vid tydliga gränser.

Fråga först om det behövs. Titta sedan i JDK. Skriv liten, konkret kod när semantiken är er egen. Och låt specialistbiblioteken ta det som tillhör ett svårt protokoll, en säkerhetsstandard eller en resursmanager.
Det här är en idé jag gärna vill tänka vidare på tillsammans med andra – inget migrationsrecept. Jag är fullt beredd på att den håller sämre i verkligheten än på pappret. Frågan jag tycker är intressant är inte “kan vi ta bort Spring?”, utan “vilken teknik ger faktiskt lägst total ägarbörda för just den här tjänsten?” Har du erfarenheter som pekar åt ett annat håll vill jag gärna höra dem.