2011-09-08 20 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.xmlまたはresources.groovyに定義します。 grails documentationは、Springアプリケーションコンテキストへのアクセス方法について非常に明確です。

+0

ありがとうございます。私は初めてこれを読んだとき、私はまだ何も文脈を持っていなかったので、それを吸収しなかったと思う。感謝します! – skaz

+0

@skazについては、http://www.grails.org/FAQのFAQをご覧ください。ブラウザで 'applicationContext'を検索すると、いくつかのオプションもあります。 – hvgotcodes

+0

ありがとう - 私はそれを感謝します。 – skaz

4

あなたは、あなたが興味を持っている方の豆取得するためにこれを使用することができ

ApplicationContext ctx = grailsApplication.mainContext 

を使用して、任意のGrailsのアーティファクトからアプリケーションコンテキストにアクセスすることができます。

ないクラスで
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がコンパイル時に知られている場合は、ちょうどすべてのresources.xmlまたはresources.groovy

4

まずで一緒に豆を配線、あなたのgrails-app/conf/spring/resources.groovyにあなたの戦略を定義したい:

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

次に、あなただけでdefあなたのサービスに同じ名前のプロパティ:(このようなサービスやドメインクラスなど)の任意のGrailsのアーティファクトで

class SomeGrailsService { 
    def myStrat 

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

、Grailsは自動的にmyStratを与えますプロパティに正しい値を設定します。ユニットテストでは自動配線が行われないため、ユニットテストでは手動で値を与えなければならないことを忘れないでください。 Grailsのアーチファクトの外

、あなたのようなものを使用することができます:Grailsの2.0、グレアムらで

def myStrat = ApplicationHolder.application.mainContext.myStrat 

は、(ApplicationHolderConfigurationHolderなど)*Holderクラスの使用を卑下しているので、私はよGrails 2.0がどのようなアプローチになるのかはよくわかりません...