Start here. This is the direct spoken answer to practice first.
Overview
Spring's cache abstraction intercepts method calls; the annotation describes cache behavior while the provider owns storage and eviction capabilities.
@Cacheable checks a cache before invoking the method and stores the result on a miss. @CachePut always invokes the method and updates the cache, while @CacheEvict removes entries. Keys can come from method arguments or an explicit expression. In the default proxy mode, self-invocation does not pass through the interceptor, so an annotated method called from the same bean may not cache at all.