
Spring
Frameworks & libraries
Spring is voor mij vooral sterk wanneer je het gebruikt waarvoor het bedoeld is: een solide basis neerzetten zonder je architectuur onnodig afhankelijk te maken van het framework.
Vanuit mijn Java-achtergrond werk ik al jaren met Spring Boot, Spring Data JPA en Spring Reactor. De laatste periode heb ik vooral veel gewerkt met Spring in combinatie met Kotlin, onder andere bij ANWB binnen het Auto Informatie Platform. Daar draaide een groot deel van de backend op Spring Kotlin, MongoDB en Redis.
Waarom Spring?
Spring heeft een volwassen ecosysteem en geeft je als backend engineer veel vrijheid. Je kunt snel ontwikkelen, maar tegelijkertijd ook complexe platformen gestructureerd opbouwen.
Wat ik er sterk aan vind:
volwassen en breed inzetbaar;
sterke integraties met databases, messaging en security;
goede ondersteuning voor Java én Kotlin;
geschikt voor zowel REST als event-driven toepassingen;
veel standaardfunctionaliteit zonder alles zelf opnieuw te hoeven bouwen.
Voor mij blijft daarbij wel één principe belangrijk:
Spring moet je architectuur ondersteunen, niet bepalen.
Spring Kotlin bij ANWB
Bij ANWB heb ik recent veel gewerkt met Spring Kotlin binnen het Auto Informatie Platform. Het platform verwerkt voertuig- en mobiliteitsdata vanuit verschillende externe databronnen en vormt daarmee een belangrijk onderdeel van klantgerichte mobiliteitsdiensten.
Toen ik binnen het team startte, was de applicatie technisch sterk monolithisch ingericht binnen een microservice-landschap. Vanuit daar hebben we de architectuur verder ontwikkeld richting een meer event-driven opzet met een duidelijkere scheiding tussen verantwoordelijkheden.
Een belangrijk onderdeel daarvan was het structureren van complexe en soms inconsistente datastromen van externe partijen. Hiervoor heb ik onder andere gewerkt aan een asynchrone task scheduler met Kotlin Coroutines en Redis, en later aan de overstap naar Redis Streams voor betrouwbaardere event- en messageverwerking.
Juist daar vind ik de combinatie van Spring en Kotlin sterk. Spring levert het volwassen ecosysteem, terwijl Kotlin helpt om de code compacter en expressiever te maken.
Hoe ik Spring graag inzet
Ik probeer Spring bewust aan de buitenkant van de applicatie te houden.
Businesslogica moet bijvoorbeeld niet alleen te testen zijn wanneer een volledige Spring-context wordt opgestart. Controllers moeten dun blijven en technische details rondom persistence of messaging horen niet door de hele applicatie heen te lekken.
Mijn uitgangspunt is daarom:
duidelijke verantwoordelijkheden, weinig magie en alleen abstraheren wanneer het daadwerkelijk waarde toevoegt.
Spring maakt het namelijk heel eenvoudig om snel nieuwe componenten, annotations en configuratie toe te voegen. Dat is krachtig, maar kan een applicatie ook snel onnodig complex maken.
Spring binnen event-driven architecturen
Spring wordt vaak geassocieerd met traditionele REST-services, maar voor mij stopt het daar niet.
Binnen event-driven systemen krijg je te maken met andere vraagstukken, zoals:
retries;
idempotency;
message delivery;
ordering;
foutafhandeling;
Immediate en Eventual Consistency.
Spring kan veel van de technische basis faciliteren, maar het framework lost deze architecturale problemen niet automatisch op.
Dat onderscheid vind ik belangrijk. Een framework is gereedschap. De kwaliteit van het systeem zit uiteindelijk in de keuzes die je eromheen maakt.
Veelgestelde vragen
Gebruik je Spring altijd?
Nee. Spring is een sterke keuze, maar niet automatisch de juiste keuze. Ik werk bijvoorbeeld ook veel met Quarkus. De context, requirements en operationele eigenschappen van een systeem bepalen voor mij welk framework het beste past.
Spring met Java of Kotlin?
Beide, maar de afgelopen periode heb ik veel Spring Kotlin gedaan. Kotlin maakt veel code compacter en expressiever, zolang je de taal ook daadwerkelijk als Kotlin gebruikt en niet alleen Java-patronen één-op-één overneemt.
Wat vind je het grootste risico van Spring?
Dat gemak langzaam verandert in complexiteit. Spring neemt veel werk uit handen, maar juist daardoor moet je bewust blijven nadenken over verantwoordelijkheden, afhankelijkheden en architectuur.
Mijn uitgangspunt
Spring is voor mij geen architectuur.
Het is een volwassen framework waarmee je een goede architectuur kunt ondersteunen.
Daarom probeer ik ook binnen Spring vast te houden aan dezelfde principes die ik breder binnen backend engineering belangrijk vind:
simpel waar het kan, gestructureerd waar het moet en duurzaam voor wat daarna komt.