【问题标题】:How to inject Grails services into src/groovy classes如何将 Grails 服务注入 src/groovy 类
【发布时间】: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


    【解决方案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 一起使用。非常感谢!
    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 2012-05-25
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多