我有 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/