我有一个这样的文件:
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()或在项目中使用groovy类,并执行类似 GroovyBeanDefinitionReader.metaClass.init = {}
的操作答案 0 :(得分:1)
GroovyBeanDefinitionReader
没有提供导入bean的方法,同时允许您传入绑定。它会为此创建自己的绑定,请参阅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])
}
}
答案 1 :(得分: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")