使用 grails bean 定义将闭包传递给 spring bean
Passing a Closure to a spring bean using grails bean definitions
是否可以有一个包含闭包的 bean 定义?有时,我希望拥有几乎相同的 Class 实例,但在一些小行为上有所不同 - 不仅仅是数据,所以仅仅在我的 bean 定义中传递不同的字段是不够的。
示例所需的 bean 定义:
beans {
myCustomWidget1(Widget) {
myClosure = { w -> return w.doThis() }
}
myCustomWidget2(Widget) {
myClosure = { w -> return w.doThat() }
}
}
示例class:
class Widget {
Closure myClosure
...
}
问题是 Anonymous (Inner) Beans 已经使用闭包语法并且这些匿名 bean 在应用程序启动时被评估,而不是设置 class 的闭包字段。这显然会导致运行时出现异常。
我之前克服了这个问题,创建了我注入到我的 bean 中的小助手 classes,行为更改被编写为具有相同名称的方法。我相信这是正确的方法,但我希望有一种更简洁的 'groovy' 方式。
我们使用的是 Grails 2.4.2,但我相信 BeanBuilder 会将我想要的 Closure 视为匿名 bean,无论 grails/groovy 版本如何。
一种方法是代替这个...
beans {
myCustomWidget1(Widget) {
myClosure = { w -> return w.doThis() }
}
myCustomWidget2(Widget) {
myClosure = { w -> return w.doThat() }
}
}
试试这个...
beans {
myCustomWidget1(Widget) { bean ->
bean.setPropertyValue 'myClosure', { w -> return w.doThis() }
}
myCustomWidget2(Widget) { bean ->
bean.setPropertyValue 'myClosure', { w -> return w.doThat() }
}
}
是否可以有一个包含闭包的 bean 定义?有时,我希望拥有几乎相同的 Class 实例,但在一些小行为上有所不同 - 不仅仅是数据,所以仅仅在我的 bean 定义中传递不同的字段是不够的。
示例所需的 bean 定义:
beans {
myCustomWidget1(Widget) {
myClosure = { w -> return w.doThis() }
}
myCustomWidget2(Widget) {
myClosure = { w -> return w.doThat() }
}
}
示例class:
class Widget {
Closure myClosure
...
}
问题是 Anonymous (Inner) Beans 已经使用闭包语法并且这些匿名 bean 在应用程序启动时被评估,而不是设置 class 的闭包字段。这显然会导致运行时出现异常。
我之前克服了这个问题,创建了我注入到我的 bean 中的小助手 classes,行为更改被编写为具有相同名称的方法。我相信这是正确的方法,但我希望有一种更简洁的 'groovy' 方式。
我们使用的是 Grails 2.4.2,但我相信 BeanBuilder 会将我想要的 Closure 视为匿名 bean,无论 grails/groovy 版本如何。
一种方法是代替这个...
beans {
myCustomWidget1(Widget) {
myClosure = { w -> return w.doThis() }
}
myCustomWidget2(Widget) {
myClosure = { w -> return w.doThat() }
}
}
试试这个...
beans {
myCustomWidget1(Widget) { bean ->
bean.setPropertyValue 'myClosure', { w -> return w.doThis() }
}
myCustomWidget2(Widget) { bean ->
bean.setPropertyValue 'myClosure', { w -> return w.doThat() }
}
}