当前位置: 首页 > 知识库问答 >
问题:

从同一类中调用Spring cache@Cacheable方法时被忽略

鄢翰藻
2023-03-14

我试图从同一个类中调用@Cacheable方法:

@Cacheable(value = "defaultCache", key = "#id")
public Person findPerson(int id) {
   return getSession().getPerson(id);
} 

public List<Person> findPersons(int[] ids) {
   List<Person> list = new ArrayList<Person>();
   for (int id : ids) {
      list.add(findPerson(id));
   }
   return list;
}

希望findPerson的结果也被缓存,但是@Cacheable注释被忽略,并且每次都执行findPerson方法。

我是做错了什么,还是故意的?

共有3个答案

全流觞
2023-03-14

对于任何使用GrailsSpringCache插件的人,文档中描述了一种解决方法。我在grails应用程序中遇到了这个问题,但不幸的是,公认的答案似乎无法用于grails。这个解决方案很难看,但它是有效的。

示例代码很好地演示了这一点:

class ExampleService {
    def grailsApplication

    def nonCachedMethod() {
        grailsApplication.mainContext.exampleService.cachedMethod()
    }

    @Cacheable('cachedMethodCache')
    def cachedMethod() {
        // do some expensive stuff
    }
}

只需替换exampleService。cachedMethod()使用您自己的服务和方法。

闾丘德业
2023-03-14

下面是我为在同一个类中只使用少量方法调用的小项目所做的。强烈建议使用代码内文档,因为它可能会给同事带来不便。但它易于测试、简单、快速实现,并且省去了全面的AspectJ工具。但是,对于更频繁的使用,我建议使用AspectJ解决方案

@Service
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
class PersonDao {

    private final PersonDao _personDao;

    @Autowired
    public PersonDao(PersonDao personDao) {
        _personDao = personDao;
    }

    @Cacheable(value = "defaultCache", key = "#id")
    public Person findPerson(int id) {
        return getSession().getPerson(id);
    }

    public List<Person> findPersons(int[] ids) {
        List<Person> list = new ArrayList<Person>();
        for (int id : ids) {
            list.add(_personDao.findPerson(id));
        }
        return list;
    }
}
楚建柏
2023-03-14

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

简而言之,自调用绕过了动态代理,也绕过了作为动态代理逻辑一部分的任何交叉问题,如缓存、事务等。

修复方法是使用AspectJ编译时或加载时编织。

 类似资料:
  • 问题内容: 我试图从同一个类中调用一个方法: 并希望也缓存来自的结果,但是注释将被忽略,并且每次都会执行该方法。 我在这里做错什么了吗,或者这是故意的? 问题答案: 这是因为在Spring中创建代理来处理缓存,与事务相关的功能的方式。这是Spring如何处理它的很好参考- 事务 简而言之,自我调用会绕过动态代理,并且绕过动态代理逻辑一部分的所有交叉问题(例如缓存,事务等)也会被绕过。 解决方法是使

  • 当我从not bean类中的方法调用Cacheable方法时,我突然发现@Cacheable不起作用。 请在下面找到我的代码,并帮助我什么是问题或我错过的东西。

  • 可能是问题似乎是重复的其他,但我已经检查了其他类似的问题,并尝试解决,但没有任何工作。 我正在使用缓存注释对服务类进行注释,如下所示: 我正在另一个服务类中自动生成CacheFacade。当我从那个类调用addRequest时,它可以工作,但当我调用getRequest时,它没有被调用,我尝试在那里添加日志和调试点,但流没有在那里。 这是我调用缓存服务类的主要服务类: 谁能告诉我,我做错了什么,为

  • 从同一bean的另一个方法调用缓存的方法时,Spring缓存不工作。 这里有一个例子来清楚地解释我的问题。 配置: 缓存服务: 结果: 方法调用在第二次调用中使用缓存。但是,当在AService类中调用方法时(在中),Cache未被使用。 这就是SpringCache的工作原理还是我遗漏了什么?

  • 问题内容: 从同一bean的另一个方法调用缓存的方法时,Spring缓存不起作用。 这是一个示例,可以清楚地说明我的问题。 组态: 缓存的服务: 结果: 该方法调用使用缓存在第二次调用预期。但是,在类中()中调用该方法时,则未使用Cache。 这是Spring缓存的工作方式还是我缺少什么? 问题答案: 我相信这是这样的。从我记得阅读的内容来看,生成了一个代理类,该代理类可以拦截所有请求并使用缓存的

  • 问题内容: 我是python的新手。我试图在类中将值从一种方法传递给另一种方法。我搜索了该问题,但无法获得适当的解决方案。因为在我的代码中,“ if”正在调用类的方法“ on_any_event”,而该方法反过来应该调用我的另一个方法“ dropbox_fn”,该方法利用了“ on_any_event”中的值。如果“dropbox_fn”方法在类之外,它将起作用吗? 我将用代码说明。 这里的主要问