为什么添加@EnableCaching后不配置CacheManager缓存无法正常工作?
@EnableCaching 是Spring缓存体系的功能启用注解,核心职责仅包含以下两点:
- 导入缓存切面的核心配置类,注册
CacheInterceptor、CacheOperationSource等基础组件,为@Cacheable/@CachePut/@CacheEvict等缓存注解提供AOP拦截能力 - 标记当前应用开启缓存注解支持,框架会为标注了缓存注解的Bean生成代理对象,在方法执行前后插入缓存逻辑
它本身不负责任何CacheManager实现的实例化、配置工作。
分两种场景说明:
纯Spring Framework(非Spring Boot)环境
Spring原生框架没有自动装配的约定逻辑,@EnableCaching 仅会完成缓存切面的基础配置,不会主动实例化任何CacheManager实现。你需要手动声明CacheManager Bean,常用的SimpleCacheManager本身设计为静态缓存管理组件,必须在初始化时显式注册所有需要用到的缓存实例,否则调用到未注册的缓存名就会抛出找不到缓存的异常。
Spring Boot 环境
Spring Boot的缓存自动配置逻辑由spring-boot-starter-cache模块提供,只有满足以下所有条件时,才会自动创建默认的ConcurrentMapCacheManager(简单内存缓存管理器):
- 项目中引入了
spring-boot-starter-cache依赖 - 类路径下没有引入其他第三方缓存实现(如Redis、Caffeine、EhCache)
- 项目中没有自定义的CacheManager Bean
如果不满足以上条件,框架不会自动生成简单缓存管理器。
Spring Boot 2.1及以上版本中,引入spring-boot-starter-cache依赖后,框架会自动开启缓存注解支持,不需要开发者显式添加@EnableCaching注解,因此你删除该注解后不会观察到逻辑变化。
你遇到的java.lang.IllegalArgumentException: 找不到名为'example'的缓存异常,是因为生效的CacheManager为SimpleCacheManager,该实现默认不支持动态创建缓存,必须在初始化时提前注册所有用到的缓存名称。你手动注册SimpleCacheManager并添加example缓存实例后,匹配到了缓存注解的配置要求,因此异常消失、缓存正常工作。
内容的提问来源于stack exchange,提问作者user16722881

