How to inject Grails services into src/groovy classes

前端 未结 1 1349
情书的邮戳
情书的邮戳 2020-12-13 20:22

Grails 2.4.x here. If I created a Grails service using grails create-service com.example.Widget, then how can I inject a reference of that service (a \"bean\")

相关标签:
1条回答
  • 2020-12-13 21:10

    1) You can use Spring Beans to inject a service into a non-artefact groovy file, using resources.groovy:

    MyClass.groovy

    class MyClass {
        def widgetService
        ...
    }
    

    resources.groovy

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

    2) There is also an additional @Autowired annotation that can do the same thing:

    MyClass.groovy

    import org.springframework.beans.factory.annotation.Autowired
    
    class MyClass {
        @Autowired
        def widget
        ...
    }
    

    resources.groovy

    beans = {
        myclass(com.example.MyClass) {}
    }
    

    Notice - this time the myclass bean doesn't need the reference to the widget.

    3) There is an alternative to injecting the WidgetService - using the Holders class to get the grailsApplication which will have a reference to the existing bean.

    import grails.util.Holders
    
    class MyClass {
        def widgetService = Holders.grailsApplication.mainContext.getBean('widgetService')
    
        ...
    }
    

    **Update**

    4) There is another option that is a hybrid of 1) and 2) - Having the bean(s) injected by autowire=true within resources.groovy:

    MyClass.groovy

    class MyClass {
        def widgetService
        ...
    }
    

    resources.groovy

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

    This is the approach I've been using locally as I feel it's the cleanest, but it does take more advantage of Grail's 'magic' (for better or worse).

    0 讨论(0)
提交回复
热议问题