春季范围事件可能吗?

Ste*_*ich 6 java spring vaadin

Spring事件机制支持发布应用程序事件,并通过@EventListener注释在Spring组件中侦听这些事件。但是,在文档的特定范围内,我找不到任何有关发送事件的信息。我对Vaadin的具体需求是:

  • 在用户交互的上下文中,发送事件(例如,已登录事件)
  • 此事件仅应由相同的bean占用@UIScope,即不应影响其他用户UI

那可能吗?注意:这并非真的专门针对Vaadin。我也可以问一下Spring Web mvc请求范围如何实现。

Jer*_*and 3

TL;DR:我认为它已经按照你想要的方式工作了

长版:

文档对此有些不清楚,但尝试了一个简单的测试:

发布事件的控制器:

@Controller
public class FooController {
    @Autowired
    private ApplicationEventPublisher publisher;

    @GetMapping("/fireEvent")
    public void fireEvent() {
        publisher.publishEvent(new FooEvent(this));
    }
}
Run Code Online (Sandbox Code Playgroud)

以及一个监听的作用域 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

当运行两个并发请求时,只有作用于同一 httprequest 的侦听器才能获取事件。


我的解释(没有深入研究过,所以持保留态度):

在我看来,ApplicationEventMulticaster'sListenerRetriever使用 BeanFactory 来获取先前注册为侦听器的 bean(按其名称)。显然,工厂将返回当前范围内的 bean。