spring - 使用 grails bean 定义将闭包传递给 spring bean

标签 spring grails groovy javabeans spring-bean

是否可以有一个包含闭包的 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/

相关文章:

java - Spring MVC validator 注解 + 自定义验证

spring - 通过spring注解的方式给出bean id

json - Grails 枚举到 JSON

Grails RabbitMQ native 过滤发送给消费者的消息

java - 如何定义JPA?

java - Spring Boot 热重载在 IntelliJ 社区版中不起作用

mysql - 在 MySQL、Grails 2 应用程序较长时间不活动期间保持池连接处于事件状态(或超时并获得新连接)的正确方法

grails - Groovy ConfigSlurper : how to modify a closure in a config?

Grails 创建例程

multithreading - Groovy 并发