我有会话作用域的bean,希望它们侦听事件。例如
@Component
@VaadinSessionScope
public class MyView {
@EventListener
public void onSearch(SearchEvent event) {
}
}
问题是,如果我添加@EventListener
批注,则会创建所有作为事件侦听器的会话范围的Bean。
是否有一种方法可以防止创建bean,而仅将事件发送到已经存在的bean,或者我可以通过编程方式注册事件处理程序?
答案 0 :(得分:0)
我决定去进行程序化事件处理程序注册。
您需要可以注入的ApplicationEventMulticaster:
@Autowired
ApplicationEventMulticaster applicationEventMulticaster;
然后,我拥有对动态创建的EventListener
的引用:
private ApplicationListener<ApplicationEvent> applicationEventApplicationListener;
请务必注意,该类不得实现ApplicationListener
接口。这与用@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);
}
}
那终于对我有用。