原型组件的 Spring 事件处理

问题描述 投票:0回答:2

假设我有两个组件 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.
 }
}
java spring scope prototype event-listener
2个回答
3
投票

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

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

bean 部署的非单例、原型范围导致 每次请求特定的 bean 时都会创建一个新的 bean 实例 豆子做好了。

如果您希望 Spring 重用您的

Y
实例,请将其声明为单例(即根本不定义
@Scope


0
投票

我也遇到过类似的问题 - 项目的要求将组件类型强加为原型,但我需要让它们监听事件并避免在收到的每个事件上创建新实例。

假设您有

MyEvent
类,它是您的事件对象。遇到这种情况你可以做的是:

  1. 创建一个监听事件的单例组件,我们称之为
    EventProcessor
  2. 使用方法创建接口
    MyEventListener
    void onMyEvent(MyEvent event)
  3. EventProcessor
    内部定义添加监听器的方法,例如:
    addMyEventListener(MyEventListener listener)
    。让听众留在您选择的集合中。
  4. EventProcessor
    内部定义接收
    MyEvent
    事件的方法,并用
    @EventListener
    进行注释。此方法必须遍历
    MyEventListener
    对象列表,并在每个对象上调用
    onMyEvent(event)
  5. 在原型组件中实现
    MyEventListener
    接口。
  6. EventProcessor
    注入原型组件,然后执行:
    eventProcessor.addMyEventListener(this)

现在,每当

EventProcessor
接收到
MyEvent
事件时,它都会将其传递给所有注册的侦听器。您可以根据需要将任意多个
@EventListener
方法添加到
EventProcessor

这只是一个蓝图,还有几件事需要考虑,比如删除监听器、异步处理(如果需要)等。但总体思路应该没问题。

© www.soinside.com 2019 - 2024. All rights reserved.