繁体   English   中英

EventListener使Spring创建所有作用域bean

[英]EventListener makes Spring create all scoped beans

我有会话范围的bean,希望他们听事件。 例如

@Component
@VaadinSessionScope
public class MyView {

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

问题是如果我添加了@EventListener注释,那么创建了事件侦听器的所有会话作用域bean。

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

我决定去编程事件处理程序注册。

您需要可以注入的ApplicationEventMulticaster:

@Autowired 
ApplicationEventMulticaster applicationEventMulticaster;

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

private ApplicationListener<ApplicationEvent> applicationEventApplicationListener;

请务必注意,该类不得实现ApplicationListener接口。 这与使用@EventListener注释方法@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);
    }
}

这最终对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM