将属性/变量传递给导入的bean

时间:2016-04-30 20:14:50

标签: spring groovy

我有一个这样的文件:

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 = {}

的操作

2 个答案:

答案 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")