2014-09-23 78 views
0

在普通的Groovy类的方法中是否可以使用Grails缓存插件的注释(即:@Cacheable)?插件的文档没有提及任何关于正常Groovy类的内容,并且基于我自己的测试,注释在普通类中使用时没有效果。所以我只是想知道是否有办法让注释在一个正常的Groovy类中工作。在正常的Groovy类上使用Grails缓存插件注释

当前的替代方法是通过缓存管理器bean直接访问方法中的缓存,但是使用注释会更好。

回答

1

不,注释仅适用于服务和控制器。该插件检测注释并为服务创建一个代理,该代理拦截所有方法调用并首先执行与缓存相关的工作。因此,如果该方法的缓存中存在值,则不会打扰调用实际方法,而是返回缓存的值。但是如果它没有被缓存,它会调用你的方法并使用它的返回值,但是稍后缓存它。

这是有效的,因为你必须从Spring ApplicationContext(或者让Grails为你做这件事)检索服务,这给了Spring一个给你代理而不是实际实现实例的机会,但是Spring没有办法了解如何在不使用AOP或其他更具侵入性的解决方案的情况下访问常规Groovy类。

话虽如此,该插件可能是过度严格限制只有控制器和服务。它特别处理控制器,因为它们涉及缓存web请求而不是方法返回值,但就缓存而言,Grails服务和任何其他带注释的Spring bean之间应该没有太大的区别。您可以手动添加自己的Spring bean,可以手动添加到grails-app/conf/spring/resources.groovy中,也可以将它们添加到Config.groovy中的grails.spring.bean.packages列表中,以便更新插件以查找所有带注释的类。你可以在插件的JIRA请求这个https://jira.grails.org/browse/GPCACHE