Grails:在域类中动态注入服务

ruk*_*che 5 service grails groovy dependency-injection

我需要注入一个基于域属性的服务,到目前为止我想出了以下内容:

ApplicationHolder.application.getServiceClass("package.${property}Service").clazz
Run Code Online (Sandbox Code Playgroud)

但以这种方式加载它不会注入它的依赖服务.我做错了吗?

Bur*_*ith 15

新实例将绕过Spring的依赖管理; 您需要从应用程序上下文中获取配置的单例bean.请改用:

def service = ApplicationHolder.application.getMainContext().getBean("${property}Service")
Run Code Online (Sandbox Code Playgroud)

这假定'property'是服务的部分bean名称,即对于FooBarService,该属性必须是'fooBar'.如果它是'FooBar',那么您可以使用GrailsNameUtils.getPropertyName()来修复它:

import grails.util.GrailsNameUtils

String beanName = GrailsNameUtils.getPropertyName(property) + 'Service'
def service = ApplicationHolder.application.getMainContext().getBean(beanName)
Run Code Online (Sandbox Code Playgroud)