【问题标题】:Passing a Closure to a spring bean using grails bean definitions使用 grails bean 定义将闭包传递给 spring bean
【发布时间】:2017-10-26 19:03:38
【问题描述】:

是否可以有一个包含闭包的 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 在应用程序启动时被评估,而不是设置类的闭包字段。这显然会导致运行时异常。

我以前通过创建注入到我的 bean 中的小型辅助类来克服这个问题,并将行为更改编写为具有相同名称的方法。我相信这是正确的方法,但我希望有一种更简洁的“常规”方式。

我们使用的是 Grails 2.4.2,但我相信 BeanBuilder 会将我想要的 Closure 视为匿名 bean,无论 grails/groovy 版本如何。

【问题讨论】:

    标签: spring grails groovy javabeans spring-bean


    【解决方案1】:

    一种方法是代替这个......

    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() }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 2013-03-24
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 2011-06-02
      • 1970-01-01
      相关资源
      最近更新 更多