我有一個這樣的文件:通屬性/變量,進口豆
beans {
"$id"(String, "${val}")
}
我希望能夠通過ID和VAL。
如果我在同一個文件中定義它們,它就可以工作。如果我在加載應用程序上下文時使用綁定來定義它們,它也可以工作。但我希望能夠做到這樣的事情:
beans {
def id = "foo"
def val = "bar"
importBeans("path_to_the_above_file")
}
想法是通過每次覆蓋bean id和值多次導入這些bean。基本上,將其用作模板。不知道它可以完成。但我真的很討厭在導入的文件中複製所有的bean只是爲了改變ID。
這是我想有一個最終的結果是什麼:
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(),或在項目中的常規類,並做類似GroovyBeanDefinitionReader.metaClass.init = {}
我的意思通過使用元級,是添加一個方法。例如:'importBeans(String path,Map variables)'。注意:混淆元類應該在..本身之外完成。在您的應用初始化之前。注意:創建一個實例時,它將獲得它自己的類的元類的私有副本。因此,如果您然後更改類的元類,實例將不會看到更改。 –