2016-04-30 4 views
2

私はこのようなファイルを持っています。パスプロパティは

私はそれらを同じファイル内で定義すると動作します。アプリケーションコンテキストをロードするときにバインディングを使用してそれらを定義すると、同様に機能します。しかし、私はこのような何かを行うことができるようにしたい:

beans { 

    def id = "foo" 
    def val = "bar" 

    importBeans("path_to_the_above_file") 

} 

アイデアは豆のIDと値を毎回上書きすることにより、これらのBeanを複数回インポートすることです。基本的には、テンプレートとして使用します。それができるかどうかわからない。しかし、IDを変更するためだけに、インポートしたファイルにすべてのBeanをコピーするという考えは本当に嫌です。

これは私が最終的な結果が欲しいものです:答えで提案されているように

beans { 

    def id = "foo" 
    def val = "bar" 

    importBeans("path_to_the_above_file") 

    id = "foo2" 
    val = "bar2" 

    importBeans("path_to_the_above_file") 

    foo3(String, foo) 
    foo4(String, foo2) 
} 

をまあ、私はそれがメタクラスを使用して作業しました:

beans { 

    GroovyBeanDefinitionReader.metaClass.id = "foo" 
    GroovyBeanDefinitionReader.metaClass.val = "bar" 

    importBeans("classpath:config/mytest.groovy") 

    setId("foo2") 
    setVal("bar2") 

    importBeans("classpath:config/mytest.groovy") 

} 

唯一の欠点があります私はExpandoMetaClassを初期化しておく必要があり、Spring Groovyの定義自体からその方法を見つけることはできません。私はExpandoMetaClass.enableGlobally()を呼び出すエーテルまたはプロジェクトでGroovyのクラスを持っているとGroovyBeanDefinitionReader.metaClass.init = {}

+0

にしたがメソッドを追加します。次のようなものがあります: 'importBeans(String path、Map variables)'。注:メタクラスを混乱させることは、それ自体の外で行うべきです。アプリの初期化の早い段階。注:インスタンスが作成されると、インスタンスはクラスのメタクラスの専用コピーを取得します。したがって、クラスのメタクラスを変更すると、インスタンスに変更が表示されません。 –

答えて

1

GroovyBeanDefinitionReaderは豆しばらくをインポートする方法を提供していないような何かをする必要がありますバインディングを渡すことができます。それはそれは、それぞれこの結合所有しています作成し、あなたの代わりに何ができるかhttps://github.com/spring-projects/spring-framework/blob/master/spring-beans-groovy/src/main/java/org/springframework/beans/factory/groovy/GroovyBeanDefinitionReader.java#L232

はこのようなものです参照してください。私はそれを実際に考え出した

beans { 
    [ 
     [id: 'foo', val: 'bar'], 
     [id: 'foo2', val: 'bar2'] 
    ].each { 
     invokeMethod(it.id, [String, it.val]) 
    } 
} 
+0

残念ながら、invokeMethodがどのように役立つのか分かりません。 String Beanの狭いケースを解決します。しかし、私のインクルードされたファイルは実際にはかなり複雑で、多数の豆を含んでいます。どのような種類のパラメータも渡すことができないのはかなり不便です。私は現在、設定手段としてBeanを渡していますが、複数のコピーを作成する必要がある場合は動作しません。それに対処する唯一の方法は、インクルードされたファイル全体をコピーし、すべてのBean IDを手動で変更することです。設定の悪夢のようだが、他に明白な選択肢はない。 –

+0

まだ希望を失う必要はありません!私がリンクしているソースコードを勉強すれば、必要なものを実行する方法を書くのに十分なものを見つけ出すことができます。次に、メタクラスを介してそのようなメソッドを追加できます。 –

+0

ありがとうございます。メタクラスでは決して何もしませんでしたが、試してみます。解決策が見つかったら、ここにコードを掲載します。私は、バインディングを持つファイルをロードし、そのBeanを公開するBeanを作成することを考えていました。しかし、メタクラスがうまくいくとすれば、私はそれに伴います。 –

0

。上で述べたように、インポートされたBeanは、コンテキストをロードするときにプログラムで設定されたバインディングを実際に参照します。私はちょうどgroovy設定スクリプトからそのバインディングに到達する方法を理解する必要がありました。 2つ(またはそれ以上の方法)があります。一つは、任意のBeanまたは任意のクラスを作成し、そのクロージャ内の変数を設定することです:

init(Object) { 
    getBinding().setVariable("id", "food") 
    getBinding().setVariable("val", "bar") 
} 

もう一つ、と私は良い方法だと思う:私はメタクラスを使用して、どのような意味

def beanBinding = getBinding().getProperty("beans").getBinding() 
beanBinding.setVariable("id", "food") 
beanBinding.setVariable("val", "bar")