当我间接调用方法时,@cacheable为什么无效?

0lvr5msh  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(436)

@cacheable@cacheevict无效

我有这样的服务:

@service
pubic class TestService {

  @Cacheable(cacheNames ="user",key = "#userId")
  public User fetchUserById(Long userid) {
       return new User();
  }

  public User fetchCurrentUser() {
      return fetchUserById(124L);
  }
}

有一些问题: @Cacheable 当我调用 fetchUserById(Long userid) .
但是 @Cacheable 无效,当我调用 fetchCurrentUser() .

rqmkfv5c

rqmkfv5c1#

您可以在这里找到解决方案:当从同一个类中调用spring cache@cacheable方法时忽略它
这是因为spring中为处理缓存和事务相关功能而创建代理的方式。这是spring如何处理事务、缓存和aop的一个非常好的参考:了解spring中的代理使用
简言之,一个自调用绕过了动态代理,而作为动态代理逻辑一部分的任何交叉关注点(如缓存、事务等)也被绕过。
解决方法是使用aspectj编译时或加载时编织。

相关问题