java - 范围内的 Spring 事件可能吗?
问题描述
@EventListener
Spring 事件机制支持通过注解在 Spring 组件中发布应用程序事件和监听这些事件。但是,我在文档中找不到有关在特定范围内发送事件的任何信息。我对 Vaadin 的具体需求是:
- 在用户交互的上下文中,发送事件(例如登录事件)
- 此事件应仅由相同的 bean 使用
@UIScope
,即不应影响其他用户 UI
那可能吗?注意:这并不是 Vaadin 所特有的。我还可以询问如何使用 Spring web mvc 请求范围来完成。
解决方案
TL;DR:我认为它已经按照你的意愿工作了
长版:
文档对此有些不清楚,但尝试了一个简单的测试:
发布事件的控制器:
@Controller
public class FooController {
@Autowired
private ApplicationEventPublisher publisher;
@GetMapping("/fireEvent")
public void fireEvent() {
publisher.publishEvent(new FooEvent(this));
}
}
还有一个监听的作用域bean:
@Scope(value = WebApplicationContext.SCOPE_REQUEST)
@Component
public class FooListener {
@EventListener(FooEvent.class)
public void listen() {
System.out.println("I'm listening. PS : I am "+this.toString());
}
}
并且当运行两个并发请求时,只有作用域为同一个 httprequest 的侦听器才能获取事件。
我的解释(没有深入研究它,所以持保留态度):
在我看来,ApplicationEventMulticaster
'sListenerRetriever
使用 BeanFactory 来获取先前注册为侦听器的 bean(按其名称)。显然,工厂将返回当前范围内的 bean。
推荐阅读
- python - hasattr 和 has_attr 之间的 Python 区别
- python - 关闭终端后如何保持 Django 项目运行?
- c++ - 具有相反顺序的集合上的 std::lower_bound
- android - Android - 状态栏通知未显示
- html - 使用 jQuery 更改所有选择选项
- c# - 从 NI TestStand 运行 .NET DLL 时出现奇怪的异常,但在 VS2019 中运行顺畅
- r - 为变量创建子组
- python - 如何在 tkinter 中获取活动条目小部件?
- javascript - 反应原生的承诺中的条件渲染
- tsql - 创建具有更改值的副本,TSQL