【发布时间】:2016-01-30 09:21:03
【问题描述】:
Grails 2.4.x 在这里。如果我使用grails create-service com.example.Widget 创建了一个 Grails 服务,那么如何将该服务的引用(“bean”)注入到src/groovy 下的类中?
这实际上在 Grails 官方文档的任何地方都没有解释过,并且广泛的搜索返回了 nadda。
【问题讨论】:
标签: grails dependency-injection
Grails 2.4.x 在这里。如果我使用grails create-service com.example.Widget 创建了一个 Grails 服务,那么如何将该服务的引用(“bean”)注入到src/groovy 下的类中?
这实际上在 Grails 官方文档的任何地方都没有解释过,并且广泛的搜索返回了 nadda。
【问题讨论】:
标签: grails dependency-injection
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=true 在 resources.groovy 中注入 bean:
MyClass.groovy
class MyClass {
def widgetService
...
}
resources.groovy
beans = {
myclass(com.example.MyClass) { bean ->
bean.autowire = true
}
}
这是我一直在本地使用的方法,因为我觉得它是最干净的,但它确实更多地利用了 Grail 的“魔法”(无论好坏)。
【讨论】:
grails run-app: Error loading Config.groovy: Cannot get property 'mainContext' on null object...任何想法?!?
FizzBuzzer 类上定义了一个带有 statsService 参数的构造函数,Grails 使用字段注入,因此您可以删除它,除非您打算不使用依赖注入和实例化FizzBuzzer您自己提供必要的服务。
statsService 重命名为 statisticsService 以避免涉及名称不匹配的任何潜在问题 - 尽管如果您使用 resources.groovy 和明确的ref() 这应该没关系。