java - 范围内的 Spring Activity 可能吗?

标签 java spring vaadin

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 的监听器才能获取事件。


我的解释(没有真正深入地研究它,所以对它持保留态度):

在我看来,ApplicationEventMulticasterListenerRetriever 使用 BeanFactory 来获取之前注册为监听器的 bean(通过它们的名称)。显然,工厂将在当前范围内返回一个 bean。

关于java - 范围内的 Spring Activity 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51396152/

相关文章:

spring - 将 ffmpeg 与 Spring Boot 集成

java - 如何在 Vaadin ComboBox 中使某个项目只能选择一次?

java - (Android)如何捕获应用程序主线程终止(如果将其置于后台)

java - 如何在 firebase 中获取所有 child 的数据并将其显示到我的 Android 应用程序中?

Java - 如何在事件监听器中更改 'local?' 变量

mysql - Spring MVC、Hibernate、MySQL(数据库关系)

java - 在 Spring Boot Hibernate 搜索中建立索引时屏蔽敏感数据

java - centos上安装maven 3时出错

java - 组合框和后缀槽

java - 如何在选择更改时更新 vaadin 选项卡中的内容?