服务之外的 Grails 依赖注入?
Posted
技术标签:
【中文标题】服务之外的 Grails 依赖注入?【英文标题】:Grails Dependency Injection Outside of Services? 【发布时间】: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 库就可以工作吗?谢谢!
【问题讨论】:
【参考方案1】:您在resources.xml
或resources.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.xml
或 resources.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
类(例如 ApplicationHolder
和 ConfigurationHolder
),所以我不太确定 Grails 2.0 的方法是什么...
【讨论】:
以上是关于服务之外的 Grails 依赖注入?的主要内容,如果未能解决你的问题,请参考以下文章