java - EventListener 使 Spring 创建所有作用域 bean

标签 java spring

我有 session 范围的 bean 并希望它们监听事件。例如

@Component
@VaadinSessionScope
public class MyView {

    @EventListener
    public void onSearch(SearchEvent event) {
    }
}

问题是,如果我添加 @EventListener 注释,则会创建所有作为事件监听器的 session 范围 bean。

有没有办法阻止创建 bean 并仅将事件发送到已经存在的 bean,或者我可以以编程方式注册事件处理程序吗?

最佳答案

我决定进行程序化事件处理程序注册。

您需要可以注入(inject)的 ApplicationEventMulticaster:

@Autowired 
ApplicationEventMulticaster applicationEventMulticaster;

然后我持有对动态创建的 EventListener 的引用:

private ApplicationListener<ApplicationEvent> applicationEventApplicationListener;

需要注意的是,该类不得实现 ApplicationListener 接口(interface)。这与使用 @EventListener 注解方法相同,并且会导致创建不需要的 bean。

private ApplicationListener<ApplicationEvent> createApplicationEventApplicationListener() {
     return event -> onApplicationEvent(event);
}

在我的例子中,当组件变得可见时,我添加监听器,当它不可见时,我删除监听器:

if (visible) {
    if (applicationEventApplicationListener == null) {
        applicationEventApplicationListener = createApplicationEventApplicationListener();
    }
    applicationEventMulticaster.addApplicationListener(applicationEventApplicationListener);
} else {
    if (applicationEventApplicationListener != null) {
           applicationEventMulticaster.removeApplicationListener(applicationEventApplicationListener);
    }
}

这终于对我有用了。

关于java - EventListener 使 Spring 创建所有作用域 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56242501/

相关文章:

java - java 中的拼字游戏代码

java - Lambda 函数退出失败

java - Spring @Transactional 基于方法级别的条件

java - 在eclipse Juno中的所有MPerspective中添加MPart

java - 如何使用 Twilio 处理传入的短信

java - 从外部中止 JUnit 线程

java - Spring MVC 转换主体对象

java - Spring MVC 默认 View 解析器不工作?

java - tomcat应用程序未启动的maven项目错误

spring - @Transactional(read-only = true) 的目的是什么