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

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

@cacheable@cacheevict无效

我有这样的服务:

  1. @service
  2. pubic class TestService {
  3. @Cacheable(cacheNames ="user",key = "#userId")
  4. public User fetchUserById(Long userid) {
  5. return new User();
  6. }
  7. public User fetchCurrentUser() {
  8. return fetchUserById(124L);
  9. }
  10. }

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

rqmkfv5c

rqmkfv5c1#

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

相关问题