【问题标题】:Grails Dependency Injection Outside of Services?服务之外的 Grails 依赖注入?
【发布时间】:2011-11-13 02:19:24
【问题描述】:

我有一个 Grails 应用程序,它需要运行一个可能会随着时间而被换出的策略。我知道 Spring 是 Grails 的基础,所以我想知道我是否可以访问 Spring 的 IoC 容器,以便我可以在 xml 文件中外部化实际依赖项(注意:我实际上从未这样做过,但只是知道它,所以我可能是遗漏了什么)。我的目标是能够做到以下几点:

class SchemaUpdateService {
public int calculateSomething(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
IStrategy strat = (IStrategy) ctx.getBean("mystrat");
}
}

然后在 beans.xml 文件中映射适当的实现。我认为 Grails 支持这一点。有没有人有任何关于这将如何工作的文档?我真的只需要 Spring IoC 库就可以工作吗?谢谢!

【问题讨论】:

    标签: spring grails dependency-injection inversion-of-control


    【解决方案1】:

    您在resources.xmlresources.groovy 中定义您的bean。 grailsdocumentation 非常清楚如何访问 Spring 应用上下文。

    【讨论】:

    • 非常感谢。我想当我第一次阅读这篇文章时,我没有吸收任何内容,因为我还没有任何上下文。欣赏!
    • @skaz,查看grails.org/FAQ 的常见问题解答,用浏览器搜索“applicationContext”,它也有一些选项。
    【解决方案2】:

    您可以使用任何 Grails 工件访问应用程序上下文

    ApplicationContext ctx = grailsApplication.mainContext
    

    然后您可以使用它来检索您感兴趣的任何 bean:

    IStrategy strat = (IStrategy) ctx.getBean("mystrat")
    

    在无权访问grailsApplication 的类中,您可以使用如下帮助器来访问应用程序上下文和其中的 bean

    class SpringUtils {
    
        static getBean(String name) {
            applicationContext.getBean(name)
        }
    
        static <T> T getBean(String name, Class<T> requiredType) {
            applicationContext.getBean(name, requiredType)
        }
    
        static ApplicationContext getApplicationContext() {
            ApplicationHolder.application.mainContext
        }
    }
    

    但是,只有当您需要在运行时检索同一 bean 的不同实现时,才需要这样做。如果所需的 bean 在编译时已知,只需将这些 bean 连接到 resources.xmlresources.groovy

    【讨论】:

      【解决方案3】:

      首先,您要在grails-app/conf/spring/resources.groovy 中定义您的策略:

      beans = {
          myStrat(com.yourcompany.StrategyImpl) {
             someProperty = someValue
          }
      }
      

      然后,您只需将def 的同名属性添加到您的服务中:

      class SomeGrailsService {
          def myStrat
      
          def someMethod() {
              return myStrat.doSomething()
          }
      }
      

      在任何 Grails 工件(例如服务和域类)中,Grails 都会自动为 myStrat 属性赋予正确的值。但是不要忘记,在单元测试中你必须手动给它一个值,因为在单元测试中不会发生自动连接。

      在 Grails 人工制品之外,您可以使用类似的东西:

      def myStrat = ApplicationHolder.application.mainContext.myStrat
      

      在 Grails 2.0 中,Graeme 等人不赞成使用 *Holder 类(例如 ApplicationHolderConfigurationHolder),所以我不太确定 Grails 2.0 的方法是什么...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-19
        • 2015-03-13
        • 2020-09-09
        • 2011-11-10
        • 1970-01-01
        相关资源
        最近更新 更多