`@Cacheable` caches the result of a method call under a key (usually based on arguments). It’s implemented via proxies/AOP. Common gotchas: self-invocation bypasses the proxy (no caching), and caching can serve stale data unless you evict/invalidate (`@CacheEvict`) or set a TTL in the cache provider.