2011-09-08 158 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的方法會是什麼......