原型组件的 Spring 事件处理

mem*_*emn 5 java spring scope prototype event-listener

假设我有两个组件 X 和 Y,其中 X 是单例,而 Y 不是。

当我发布XUpdateEvent时,没有问题,我可以捕获该事件。但是,对于 YUpdateEvent 我无法捕获事件。Spring 为每个触发的事件创建新实例,而不是使用已经创建的实例。

那么,我是否需要编写自定义范围?或者EventListener有设置吗?

为了显示:

@Component
public class X{
 @EventListener
 public void onUpdate(XUpdateEvent event){
 // fine.
 }
}

@Component
@Scope("prototype")
public class Y{
 @EventListener
 public void onUpdate(YUpdateEvent event){
 // calls new instance of Y for each event.
 // Event should be fired for created instances.
 }
}
Run Code Online (Sandbox Code Playgroud)

Rub*_*ben 3

Spring 为每个触发的事件创建新实例,而不是使用已经创建的实例

这就是原型范围的含义。看一下文档

bean 部署的非单例原型范围会导致每次发出对该特定 bean 的请求时创建一个新的 bean 实例。

如果您希望 Spring 重用您的Y实例,请将其声明为单例(即@Scope根本不定义)