2011-09-08 156 views
7

我有一个Grails应用程序需要运行一个可能会随着时间的推移而换出的策略。我知道Spring是Grails的基础,所以我想知道是否可以访问Spring的IoC容器,这样我就可以在xml文件中外部化实际的依赖关系(注意:我从来没有真正做过这个,但只是知道它,所以我可能会遗漏了什么)。我的目标是能够做到像下面这样:服务之外的Grails依赖注入?

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

然后映射在beans.xml的文件相应的执行。我认为这在Grails中得到了支持。有没有人有关于这将如何工作的任何文档?我真的只需要Spring IoC库,它会工作吗?谢谢!

回答

5

你定义你的豆resources.xmlresources.groovy。 grails documentation非常清楚如何访问Spring应用程序上下文。

+0

非常感谢。我想,当我第一次读这篇文章时,我没有理解它,因为我还没有任何背景。欣赏它! – skaz

+0

@skaz,查看http://www.grails.org/FAQ的常见问题解答,使用浏览器搜索'applicationContext',它也有一些选项。 – hvgotcodes

+0

谢谢 - 我很感激。 – skaz

4

您可以从任何Grails的假象使用

ApplicationContext ctx = grailsApplication.mainContext 

然后可以使用这个检索取其豆你有兴趣访问应用程序上下文:

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的不同实现时,才需要这样做。如果所需的豆在编译时已知,刚丝豆一起resources.xmlresources.groovy

4

首先,要在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,格雷姆等人被弃用使用*Holder类(如ApplicationHolderConfigurationHolder),所以我不太确定Grails 2.0的方法会是什么......