在普通Groovy类上使用Grails缓存插件注释



是否可以在普通Groovy类的方法上使用Grails Cache插件的注释(即:@Cacheable)?插件的文档中没有提到任何关于普通Groovy类的内容,根据我自己的测试,在普通类中使用注释时没有任何效果。所以我只是想知道是否有一种方法可以让注释在普通的Groovy类中工作。

当前的替代方案是通过CacheManagerbean直接访问方法中的缓存,但最好使用注释。

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

这之所以有效,是因为您必须从Spring ApplicationContext中检索服务(或者让Grails为您这样做),这让Spring有机会为您提供代理,而不是真正的实现实例,但如果没有AOP或其他更具侵入性的解决方案,Spring就无法了解对常规Groovy类的访问。

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

最新更新