Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用grailsbean定义将闭包传递给springbean_Spring_Grails_Groovy_Javabeans_Spring Bean - Fatal编程技术网

使用grailsbean定义将闭包传递给springbean

使用grailsbean定义将闭包传递给springbean,spring,grails,groovy,javabeans,spring-bean,Spring,Grails,Groovy,Javabeans,Spring Bean,有可能有一个包含闭包的bean定义吗?有时,我希望一个类有几乎相同的实例,但在一些小的行为上有所不同——不仅仅是数据,所以仅仅在bean定义中传递不同的字段是不够的 所需bean定义示例: 示例类: 问题是已经使用了闭包语法,并且这些匿名bean在应用程序启动时进行计算,而不是设置类的闭包字段。这显然会导致运行时出现异常 我以前已经克服了这一问题,我创建了一些小的助手类,将它们注入到我的bean中,并将行为更改编写为具有相同名称的方法。我相信这是正确的方法,但我希望有一种更简洁的“groovy”

有可能有一个包含闭包的bean定义吗?有时,我希望一个类有几乎相同的实例,但在一些小的行为上有所不同——不仅仅是数据,所以仅仅在bean定义中传递不同的字段是不够的

所需bean定义示例:

示例类:

问题是已经使用了闭包语法,并且这些匿名bean在应用程序启动时进行计算,而不是设置类的闭包字段。这显然会导致运行时出现异常

我以前已经克服了这一问题,我创建了一些小的助手类,将它们注入到我的bean中,并将行为更改编写为具有相同名称的方法。我相信这是正确的方法,但我希望有一种更简洁的“groovy”方法


我们使用的是Grails 2.4.2,但我相信BeanBuilder会将我想要的闭包视为匿名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() }
    }
}
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() }
    }
}