Groovy / src中的Grails 2.x服务注入

时间:2012-05-17 17:25:33

标签: grails grails-2.0

我想在Groovy / src类中注入我的服务。 normaln依赖注入不起作用:

...
def myService
...

我可以使用它(它有效):

def appCtx = ApplicationHolder.application.getMainContext()
def myService = appCtx.getBean("myService");

但不推荐使用ApplicationHolder。有没有更好的解决方案?

感谢您的任何建议

4 个答案:

答案 0 :(得分:28)

ApplicationHolder的替换可以是Holders,您也可以在静态范围内使用它:

import grails.util.Holders
...

def myService = Holders.grailsApplication.mainContext.getBean 'myService'

答案 1 :(得分:12)

检查以下Grails常见问题解答,以便从src / groovy中的源代码访问应用程序上下文 - http://grails.org/FAQ#Q:如何从src / groovy中的源代码访问应用程序上下文?

没有与ApplicationHolder等效的ApplicationContextHolder类。要从src / groovy中的Groovy类访问名为EmailService的服务类,请使用以下命令访问Spring bean:

import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA
def ctx = SCH.servletContext.getAttribute(GA.APPLICATION_CONTEXT)
def emailService = ctx.emailService

答案 2 :(得分:2)

您可以通过在grails-app/conf/spring/resources.groovy中配置新的bean(或覆盖现有)来轻松注册:

// src/groovy/com/example/MyClass.groovy
class MyClass {
    def myService
    ...
}

// resources.groovy
beans = {
    myclass(com.example.MyClass) {
        myService = ref('myService')
    }
}

您也可以查看有关How to access Grails configuration in Grails 2.0?

的问题

答案 3 :(得分:2)

哟可以从resources.groovy

开始
// src/groovy/com/example/MyClass.groovy
class MyClass {
    def myService
    ...
}

// resources.groovy
beans = {
    myclass(com.example.MyClass) {
        myService = ref('myService')
    }
}

或仅使用自动装配的anotation:

// src/groovy/com/example/MyClass.groovy

import org.springframework.beans.factory.annotation.Autowired

class MyClass {
    @Autowired 
    def myService
    ...
}

// resources.groovy
beans = {
    myclass(com.example.MyClass) {}
}