首页 > 解决方案 > 当我间接调用方法时,为什么@Cacheable 无效?

问题描述

@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().

标签: springcachingannotationsinvoke

解决方案


您可以在此处找到解决方案:Spring cache @Cacheable 方法在从同一类中调用时被忽略

这是因为在 Spring 中为处理缓存、事务相关功能创建代理的方式。这是关于 Spring 如何处理它的一个很好的参考 - 事务、缓存和 AOP:理解 Spring 中的代理使用

简而言之,自调用绕过了动态代理,并且也绕过了作为动态代理逻辑一部分的缓存、事务等任何横切关注点。

解决方法是使用 AspectJ 编译时间或加载时间编织。


推荐阅读