簡體   English   中英

EventListener使Spring創建所有作用域bean

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM