Spring Boot默认缓存未生效,@Cacheable标注方法每次都被执行
Spring Boot @Cacheable缓存不生效问题排查及解决方案
核心问题原因
- 测试类依赖注入方式错误
你当前使用@InjectMocks注入的ExportService是Mockito直接实例化的普通对象,没有被Spring的AOP代理包裹。@Cacheable的缓存逻辑基于Spring AOP切面实现,只有通过Spring容器获取的代理对象调用对应方法,才会触发缓存拦截,直接调用原始类实例的方法会跳过所有AOP逻辑,因此每次都会执行完整的方法体。 - 测试类未加载Spring上下文,缓存配置未生效
标注在测试类上的@EnableCaching需要配合Spring上下文才能生效,你当前的测试类没有启动Spring容器,缓存相关的切面、缓存管理器都没有初始化,缓存配置完全不生效。
修复方案
将测试类改为Spring Boot测试模式,通过Spring容器注入ExportService实例,示例代码如下:
@SpringBootTest // 加载Spring Boot上下文 @EnableCaching public class ExportServiceTest{ @Autowired // 从Spring容器注入代理后的实例 private ExportService myService; @Test public void translateSuccess(){ String value = myService.translate("KEY", "en"); myService.translate("KEY", "en"); myService.translate("KEY", "en"); } }
如果不需要加载全量Spring上下文,可以指定加载的类减少启动耗时:
@SpringBootTest(classes = {ExportService.class})
补充校验点
确认项目的application配置文件中没有禁用默认缓存,默认情况下引入spring-boot-starter-cache后,Spring会自动使用基于ConcurrentHashMap的简单缓存实现,不需要额外配置即可生效。
内容的提问来源于stack exchange,提问作者Serban Uciu
相关产品推荐
相关产品推荐

