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