Spring事件机制支持通过@EventListener
注解在Spring组件中发布应用事件和监听这些事件。但是,我在 documentation 中找不到有关在特定范围内发送事件的任何信息。 .我对 Vaadin 的具体需求是:
- 在用户交互的上下文中,发送事件(例如登录事件)
- 此事件只能由同一
@UIScope
中的 bean 使用,即不应影响其他用户 UI
这可能吗? 注意:这并不是真正特定于 Vaadin。我还可以询问如何使用 Spring web mvc 请求范围来完成。
最佳答案
TL;DR :我认为它已经如您所愿地工作了
长版:
文档对此有些不清楚,但尝试了一个简单的测试:
发布事件的 Controller :
@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
的ListenerRetriever
使用 BeanFactory 来获取之前注册为监听器的 bean(通过它们的名称)。显然,工厂将在当前范围内返回一个 bean。
关于java - 范围内的 Spring Activity 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51396152/