- If I'm building a web service I can choose if I'm using a thread based sync approach or a reactive non blocking approach.
- Extremely opinionated and well thought out configuration management. Think of Viper from Go, or config with Pydantic from Python, just turned to 11.
- I can add support for many different data stores directly with the framework. Psql, Elasticsearch, Cassandra... the list goes on.
- Making critical sections of code, especially around data stores can usually be made transactional with a single annotation and managing the lifecycle of that transaction is similarly convenient.
- Robust caching solutions that are brain dead easy to add. I stress the robust adjective.
- Built in health metrics and ability to refresh configuration while running and rewire itself.
- Can speak OAuth2.0 out of the box.
- You can connect the logger with a little bit extra configuration to additionally spit logs out to something like Kafka with no extra code on your part.
This list alone doesn't seem super impressive but having built on things like Python+FastAPI, Node+Express/Hapi/Apollo, and Rust+Actix, while you can do all of these things, they are not generally just there, ready to use, and suitable for production.
My bread and butter used to be Spring-Boot w/ Lombok and I could take a service from inception to running in prod with fewer lines of code than I currently can with Python and FastAPI.
Extra Note: There will always come a time when developing with spring where you will shout to the high heavens about something the framework does a particular way or something you misunderstood. That is part of the pain of when the framework does so much for you.