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

sme*_*eeb 16 grails dependency-injection

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

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

tyl*_*wal 28

1)您可以使用Spring Beans将服务注入非artefact groovy文件,使用resources.groovy:

MyClass.groovy

class MyClass {
    def widgetService
    ...
}
Run Code Online (Sandbox Code Playgroud)

resources.groovy

beans = {
    myclass(com.example.MyClass) {
        widgetService = ref('widgetService')
    }
}
Run Code Online (Sandbox Code Playgroud)

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

MyClass.groovy

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

class MyClass {
    @Autowired
    def widget
    ...
}
Run Code Online (Sandbox Code Playgroud)

resources.groovy

beans = {
    myclass(com.example.MyClass) {}
}
Run Code Online (Sandbox Code Playgroud)

注意 - 这次myclassbean不需要引用widget.

3)有一种替代方法可以注入WidgetService- 使用Holders类来获取grailsApplication将引用现有bean的类.

import grails.util.Holders

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

****更新

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

MyClass.groovy

class MyClass {
    def widgetService
    ...
}
Run Code Online (Sandbox Code Playgroud)

resources.groovy

beans = {
    myclass(com.example.MyClass) { bean ->
        bean.autowire = true
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果问题仍然存在,我可以在今晚晚些时候抛出一个玩具项目,显示在github上获取服务的所有3种方式. (2认同)