Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to inject Grails services into src/groovy classes

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") into a class under src/groovy?

This is actually not explained anywhere in the official Grails docs, and extensive searching turned back nadda.

like image 405
smeeb Avatar asked Oct 30 '15 02:10

smeeb


1 Answers

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).

like image 176
tylerwal Avatar answered Nov 01 '22 11:11

tylerwal