[英]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.