Start here. This is the direct spoken answer to practice first.
Overview
Versioning is a migration mechanism for incompatible public contracts, not a substitute for compatibility discipline.
I first evolve compatibly by adding optional response fields, accepting old request shapes during migration, and preserving existing meaning. When a breaking contract is necessary, Spring MVC can resolve a version from a path segment, header, query parameter, or media-type parameter and include the version in handler mapping. I choose one strategy consistently and document supported versions. Application deployment version remains separate from API contract version.