All Insights
technical

Spring Boot 3.2: The Features I Actually Use

Past the release notes - here's what's earning its keep on real projects.

March 15, 20259 min read

Spring Boot 3.2 shipped a lot. Most teams are using maybe 20% of it. Here's the 20% that's worth knowing about.

Spring Boot 3.2 is the version I default to for new Java projects. Here's the slice I actually use, and what I skip.

What I use daily

Virtual threads (Project Loom). spring.threads.virtual.enabled=true and your blocking IO becomes essentially free in terms of thread cost. For services that mostly wait on databases or external APIs, this is transformative. I've seen p99 throughput improve 4x with no other changes.

Improved Docker image building (buildpacks integration). One-line config to get optimized layered images.

Better observability defaults. Micrometer, OpenTelemetry support out of the box. Less plumbing.

Native image support (with GraalVM). Worth using for Lambda or low-startup-cost workloads. (See my dedicated post on this.)

What I skip

  • The new RestClient API. I use WebClient or even just HttpClient from the JDK. Less Spring magic to debug.
  • A lot of the Spring Cloud kitchen sink. Most teams need @RestController + spring-boot-starter-data-jpa + a few specific things. The rest is optional.

A typical project skeleton

For a backend service in 2025:

  • Spring Boot 3.2 with virtual threads on
  • Java 21 (LTS, virtual thread native support)
  • Postgres + Spring Data JPA (or jOOQ for complex queries)
  • Flyway for migrations
  • Micrometer + OTel for observability
  • Testcontainers for integration tests
  • GitHub Actions CI

That's the skeleton I clone. It handles 90% of cases.

Java 21 + virtual threads - the killer combo

Old model: thread per request, expensive, capped at ~200 concurrent (depending on memory and JVM tuning).

New model: virtual thread per request, ~10K concurrent on the same hardware, JVM scheduler manages the actual OS threads.

For services that wait a lot (most services), this is essentially "free concurrency."

What still matters: don't hold long-lived synchronization on virtual threads. Don't pin them to OS threads with synchronized blocks. Read the Loom guide once.

The boring verdict

Spring Boot 3.2 is the most pleasant Spring I've used. The 1.x days were painful. 2.x was good. 3.x is excellent.

If you're stuck on 2.x, plan a migration. The upgrade is mostly painless if you've kept your dependencies current.

References

javaspring-bootbackend

Want to discuss this topic?

I'm always happy to dive deeper. Reach out if you have questions or want to collaborate.

Get in Touch

Command Palette

Search for a command to run...