是否可以在普通 Groovy 类中的方法上使用 Grails Cache 插件的注释(即:@Cacheable)?该插件的文档没有提到任何关于普通 Groovy 类的内容,并且根据我自己的测试,注释在普通类中使用时没有任何效果。所以我只是想知道是否有办法让注释在普通的 Groovy 类中工作。
当前的替代方法是通过缓存管理器 bean 直接访问方法中的缓存,但最好使用注释代替。
是否可以在普通 Groovy 类中的方法上使用 Grails Cache 插件的注释(即:@Cacheable)?该插件的文档没有提到任何关于普通 Groovy 类的内容,并且根据我自己的测试,注释在普通类中使用时没有任何效果。所以我只是想知道是否有办法让注释在普通的 Groovy 类中工作。
当前的替代方法是通过缓存管理器 bean 直接访问方法中的缓存,但最好使用注释代替。
不,注释仅适用于服务和控制器。该插件检测注释并为服务创建代理,该代理拦截所有方法调用并首先执行与缓存相关的工作。因此,如果该方法的缓存中有一个值,它不会打扰调用您的真实方法,而是返回缓存的值。但是如果它没有被缓存,它会调用你的方法并使用它的返回值,但会缓存它以备后用。
这是有效的,因为您必须从 Spring 检索服务ApplicationContext
(或让 Grails 为您执行此操作),这使 Spring 有机会为您提供代理而不是真正的实现实例,但 Spring 无法知道对没有 AOP 或其他更具侵入性的解决方案的常规 Groovy 类。
话虽如此,该插件在仅限于控制器和服务方面可能过于严格。它专门处理控制器,因为这些控制器涉及缓存 Web 请求而不是方法返回值,但就缓存而言,Grails 服务和任何其他带注释的 Spring bean 之间应该没有太大区别。您可以手动添加自己的 Spring bean,也可以grails-app/conf/spring/resources.groovy
将它们添加到grails.spring.bean.packages
Config.groovy 中的列表中,因此应该更新插件以查找所有带注释的类。您可以在https://jira.grails.org/browse/GPCACHE的插件 JIRA 中请求此内容