EventListener使Spring创建所有作用域的bean

时间:2019-05-21 16:17:01

标签: java spring

我有会话作用域的bean,希望它们侦听事件。例如

@Component
@VaadinSessionScope
public class MyView {

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

问题是,如果我添加@EventListener批注,则会创建所有作为事件侦听器的会话范围的Bean。

是否有一种方法可以防止创建bean,而仅将事件发送到已经存在的bean,或者我可以通过编程方式注册事件处理程序?

1 个答案:

答案 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);
    }
}

那终于对我有用。