Cacheable不生效的原因——方法内调用

Posted xuguoliang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cacheable不生效的原因——方法内调用相关的知识,希望对你有一定的参考价值。

问题情景:

一个类中有方法A和方法B,调用方法A时,每次都会调用数据库。和期望不符。

    /**
     * 方法A 
     */
    public Manager info() {
        return info(ManagerHelper.getManagerId());
    }

    /**
     * 方法B
     */
    @Cacheable(key = "#id")
    public Manager info(Long id) {
        return managerRepository.findById(id).orElseThrow(EntityExistsException::new);
    }

问题原因:

Spring 缓存注解是基于Spring AOP切面,必须走代理才能生效,同类调用或者子类调用父类带有缓存注解的方法时属于内部调用,没有走代理,所以注解不生效。

解决方法:

方式一:将缓存的方法抽离放到一个单独的类中,然后再在service的实现类中进行调用;

方式二:手动使用CacheManager来获得缓存效果。

总结:

  • 使用注解 @Cacheable 的对象必须是Spring管理的Bean。
  • 调用者必须是另一个方法。

以下情形注解式缓存是不起作用的:

同一个Bean内部方法调用,子类调用父类中有缓存注解的方法

以上是关于Cacheable不生效的原因——方法内调用的主要内容,如果未能解决你的问题,请参考以下文章

同一个类里@Cacheable缓存不起作用

Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)

@Cacheable对象内部调用缓存无效解决方案

spring boot cacheable在啥情况下不生效

Spring 缓存注解@Cacheable 在缓存时候 ,出现了第一次进入调用 方法 ,第二次不调用的异常

揭秘 Spring AOP 失效的罪因!