是否可以有一个包含闭包的 bean 定义?有时,我希望拥有几乎相同的 Class 实例,但在一些小行为上有所不同——不仅仅是数据,因此仅在我的 bean 定义中传递不同的字段是不够的。
示例所需的 bean 定义:
beans {
myCustomWidget1(Widget) {
myClosure = { w -> return w.doThis() }
}
myCustomWidget2(Widget) {
myClosure = { w -> return w.doThat() }
}
}
示例类:
class Widget {
Closure myClosure
...
}
问题是 Anonymous (Inner) Beans已经使用了闭包语法,并且这些匿名 bean 在应用程序启动时被评估,而不是设置类的闭包字段。这显然会导致运行时异常。
我以前通过创建注入(inject)到我的 bean 中的小型帮助程序类来克服这个问题,并将行为更改编写为具有相同名称的方法。我相信这是正确的方法,但我希望有一种更简洁的“常规”方式。
我们使用的是 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() }
}
}
关于spring - 使用 grails bean 定义将闭包传递给 spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46961941/