12

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

...
def myService
...

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

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

但 ApplicationHolder 已被弃用。有没有更好的解决方案?

感谢您的任何建议

4

4 回答 4

29

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

import grails.util.Holders
...

def myService = Holders.grailsApplication.mainContext.getBean 'myService'
于 2014-01-09T01:25:42.680 回答
12

检查以下 Grails FAQ 以从 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
于 2012-05-18T19:17:41.713 回答
2

您可以通过以下方式轻松注册新的(或覆盖现有的)bean grails-app/conf/spring/resources.groovy

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

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

您还可以查看有关如何在 Grails 2.0 中访问 Grails 配置的问题?

于 2012-05-18T08:38:07.903 回答
2

哟可以从resources.groovy

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

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

或仅使用自动连线注释:

// 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) {}
}
于 2015-05-20T07:25:41.880 回答