私はこのようなファイルを持っています。パスプロパティは
私はそれらを同じファイル内で定義すると動作します。アプリケーションコンテキストをロードするときにバインディングを使用してそれらを定義すると、同様に機能します。しかし、私はこのような何かを行うことができるようにしたい:
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 = {}
にしたがメソッドを追加します。次のようなものがあります: 'importBeans(String path、Map variables)'。注:メタクラスを混乱させることは、それ自体の外で行うべきです。アプリの初期化の早い段階。注:インスタンスが作成されると、インスタンスはクラスのメタクラスの専用コピーを取得します。したがって、クラスのメタクラスを変更すると、インスタンスに変更が表示されません。 –