如何将 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=true
在 resources.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 的使用进行单元或集成测试