While working on a Grails project, I came across 2 interesting things:
- autowiring for domain classes doesn’t work, even if you follow all the instructions on how to enable it (either globally, or in the domain class definition itself)
- autowiring on abstract service classes doesn’t work (so if you’re implementing a data service with some custom functionality, your services won’t get autowired)
I’ve been able to fix both of these issues using a very simple utility class:
import grails.util.Holders /** * Since Grails doesn't seem capable of autowiring into abstract classes, this * causes a bit of an issue when creating data services which do more than * just get/save. * * All those context beans are available, so we just need to fudge the idea of * autowiring, and this class helps by providing a quick reference to the * singe long line required to get those Spring beans. * * This also helps with domain classes, which have autowiring disabled, and * despite all the documentation saying the contrary, into which you cannot * autowire. * * That said, this might prove to be a faster solution for use within domain * classes anyway since we don't have to worry about autowiring happening on * every object instantiation, but rather we just have a reference to the * singular instance with in the main context. */ class Beans { static def get(String name) { Holders.grailsApplication.mainContext.getBean(name) } static def $static_propertyMissing(String name) { get(name) } }
Now, instead of setting up a service like this:
def myService
You instead define a getter method like this:
def getMyService() { Beans.myService }
You can then use “myService” as you would’ve expected to under normal autowiring circumstances.