首页 > 解决方案 > 范围内的 Spring 事件可能吗?

问题描述

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

那可能吗?注意:这并不是 Vaadin 所特有的。我还可以询问如何使用 Spring web mvc 请求范围来完成。

标签: javaspringvaadin

解决方案


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。


推荐阅读