假设我有两个组件 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.
}
}
Spring 为每个触发的事件创建新实例,而不是使用 已经创建的
这就是原型范围的含义。查看文档。
bean 部署的非单例、原型范围导致 每次请求特定的 bean 时都会创建一个新的 bean 实例 豆子做好了。
如果您希望 Spring 重用您的
Y
实例,请将其声明为单例(即根本不定义 @Scope
)
我也遇到过类似的问题 - 项目的要求将组件类型强加为原型,但我需要让它们监听事件并避免在收到的每个事件上创建新实例。
假设您有
MyEvent
类,它是您的事件对象。遇到这种情况你可以做的是:
EventProcessor
。MyEventListener
:void onMyEvent(MyEvent event)
。EventProcessor
内部定义添加监听器的方法,例如:addMyEventListener(MyEventListener listener)
。让听众留在您选择的集合中。EventProcessor
内部定义接收MyEvent
事件的方法,并用@EventListener
进行注释。此方法必须遍历 MyEventListener
对象列表,并在每个对象上调用 onMyEvent(event)
。MyEventListener
接口。EventProcessor
注入原型组件,然后执行:eventProcessor.addMyEventListener(this)
。现在,每当
EventProcessor
接收到 MyEvent
事件时,它都会将其传递给所有注册的侦听器。您可以根据需要将任意多个 @EventListener
方法添加到 EventProcessor
。
这只是一个蓝图,还有几件事需要考虑,比如删除监听器、异步处理(如果需要)等。但总体思路应该没问题。