如何将 Grails 服务注入 src/groovy 类

Posted

技术标签:

【中文标题】如何将 Grails 服务注入 src/groovy 类【英文标题】:How to inject Grails services into src/groovy classes 【发布时间】:2016-01-30 09:21:03 【问题描述】:

Grails 2.4.x 在这里。如果我使用grails create-service com.example.Widget 创建了一个 Grails 服务,那么如何将该服务的引用(“bean”)注入到src/groovy 下的类中?

这实际上在 Grails 官方文档的任何地方都没有解释过,并且广泛的搜索返回了 nadda。

【问题讨论】:

【参考方案1】:

1)您可以使用 Spring Beans 将服务注入到非人工 groovy 文件中,使用 resources.groovy

MyClass.groovy

class MyClass 
    def widgetService
    ...

resources.groovy

beans = 
    myclass(com.example.MyClass) 
        widgetService = ref('widgetService')
    

2)还有一个额外的@Autowired注解可以做同样的事情:

MyClass.groovy

import org.springframework.beans.factory.annotation.Autowired

class MyClass 
    @Autowired
    def widget
    ...

resources.groovy

beans = 
    myclass(com.example.MyClass) 

注意 - 这次 myclass bean 不需要对 widget 的引用。

3) 注入WidgetService 的替代方法是使用Holders 类来获取grailsApplication,它将引用现有的bean。

import grails.util.Holders

class MyClass 
    def widgetService = Holders.grailsApplication.mainContext.getBean('widgetService')

    ...

**更新**

4) 还有另一个选项是 1) 和 2) 的混合 - 让 autowire=trueresources.groovy 中注入 bean:

MyClass.groovy

class MyClass 
    def widgetService
    ...

resources.groovy

beans = 
    myclass(com.example.MyClass)  bean ->
        bean.autowire = true
    

这是我一直在本地使用的方法,因为我觉得它是最干净的,但它确实更多地利用了 Grail 的“魔法”(无论好坏)。

【讨论】:

谢谢@tylerwal (+1) 但是当我执行grails run-app: Error loading Config.groovy: Cannot get property 'mainContext' on null object...任何想法?!? 在您的另一个问题中,您在 FizzBuzzer 类上定义了一个带有 statsService 参数的构造函数,Grails 使用字段注入,因此您可以删除它,除非您打算不使用依赖注入和实例化FizzBuzzer您自己提供必要的服务。 另外,Grails 使用约定优于配置,因此我会在 Groovy 类中将 statsService 重命名为 statisticsService 以避免涉及名称不匹配的任何潜在问题 - 尽管如果您使用 resources.groovy 和明确的ref() 这应该没关系。 如果问题仍然存在,我可以抛出一个玩具项目,展示今晚晚些时候在 github 上获取服务的所有 3 种方式。 选项#3 对我有用。我真的不明白它如何不能与选项 #2 一起使用。非常感谢!

以上是关于如何将 Grails 服务注入 src/groovy 类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Grails 2.0 服务中对 i18n 注入 messageSource 的使用进行单元或集成测试

在 Grails 单元测试中注入服务

服务之外的 Grails 依赖注入?

从 groovy 脚本调用时将 sessionFactory 注入 grails 服务

如何列出要注入 grails 的可用对象?

在 Grails 服务中注入 LdapTemplate 以返回用户详细信息会导致空指针异常