如何在 SpEL 中引用 ApplicationEventPublisher?

How do I reference the ApplicationEventPublisher in SpEL?

我想使用来自 Spring Web Flow 步骤的 ApplicationEventPublisher#publishEvent() 发布应用程序事件。发布者通常是应用程序上下文,但除非必要(特别是模拟),否则我宁愿不做这样的假设。是否有推荐的方法从 SpEL 表达式引用发布者对象?

我最近遇到了类似的问题。我需要在特定类型的对象上从 SpEL 表达式调用函数(本质上是自动连接到表达式本身)。不幸的是,SpEL 似乎不支持它,所以我不得不在两个选项之间做出选择:

  1. 使用 bean 引用从表达式调用并确保我在上下文中使用此名称注册 bean - @myBean.someMethod()
  2. 实现并注册自定义 SpEL 函数并按类型注入 bean。然后从你的表达式中调用函数 - #someFunction()

我认为第二种方法可能更适合您的情况,因为您拥有可以在整个应用程序中使用的非常通用的功能。您还可以对函数进行单元测试并轻松模拟目标 ApplicationEventPublisher 实例。

函数注册详情请参考Spring SpEL documentation

您不能 "inject" 发布者进入 SpEL 表达式,就像使用 bean 一样。

将自定义 bean 添加到 ApplicationEventPublisherAware 的上下文中;添加 getter 并使用 @bean.publisher.publishEvent(...).