spring - 如何在 Grails 中动态选择服务

标签 spring grails dependency-injection grails-2.0

我想从我的 Controller 中根据参数动态选择服务。

目前我有一个基础服务和一些其他服务来扩展这个基础服务。根据参数,我调用了一个类,该类确实根据参数创建 bean 名称并最终调用以下内容:

import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA

class Resolver {
    def ctx

def getBean(String beanName) {
    if(!ctx) {
        ctx = SCH.servletContext.getAttribute(GA.APPLICATION_CONTEXT)
    }
    return ctx."${beanName}"
}

}

这将返回我想要的服务。但是我觉得这样做很脏。有没有人有更好的方法来处理基于某些参数获取服务(或任何其他 bean)?

谢谢。

最佳答案

ctx."${beanName}" 已添加到 ApplicationContext 元类中,因此您可以执行 def userService = ctx.userService 之类的操作.它只是 ctx.getBean('userService') 的快捷方式,因此您可以将代码更改为

return ctx.getBean(beanName)

它会是一样的,但不那么神奇。

由于您是从 Controller 或服务调用它,我会跳过 ServletContextHolder 东西并通过依赖注入(inject) grailsApplication bean 来获取上下文(def grailsApplication) 并通过 def ctx = grailsApplication.mainContext 获取它。然后将它传递给这个辅助类(记住 Spring 的大范式是依赖注入(inject),而不是老式的依赖拉取),然后就很简单了

class Resolver {
   def getBean(ctx, String beanName) {
      ctx.getBean(beanName)
   }
}

但是它是如此简单,以至于我根本不会打扰助手类:)

关于spring - 如何在 Grails 中动态选择服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13956316/

相关文章:

design-patterns - 策略模式和依赖注入(inject)有什么区别?

java - 从 HttpServletRequest 获取 XML 并用于端点

java - 动态访问 alfresco-global.properties

grails - Grails Fields插件使用<f:display>显示的自定义字段

web-services - 如何向 grails cxf Web 服务添加安全性(用户名、密码)

dependency-injection - 过滤器中的@Inject不起作用

python - Spring python : how to import another xml resource from within an xml config file

java - 如何强制spring-boot刷新资源?

grails - Grails Spring Security跳过开发人员的密码检查

android - 在 Android 上使用 Dagger 2 进行延迟注入(inject)