2013-04-10 39 views
1

我想在運行時動態註冊和取消註冊Spring ApplicationListeners,而不是在Spring配置文件中。動態刪除Spring ApplicationListener的最佳做法?

如果我不能動態刪除它們,我會發生內存泄漏。

這是我最好的猜測:

我可以打電話給AbstractApplicationContext.getApplicationEventMulticaster().add/removeApplicationListener()

這是推薦的方法嗎?

有沒有人動態刪除偵聽器?

回答

2

以下工作。這對於實現ApplicationListener並經常創建/銷燬的原型bean特別有用。如果你沒有註銷它們,你最終會發生內存泄漏。

ApplicationEventMulticaster aem = context.getBean(AbstractApplicationContext.APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class); 

aem.removeApplicationListener(appListener); 
0

我認爲你推薦的方法很好。您還可以讓您的聽衆使用相同或相似的技術刪除自己。

但是我會問自己其他問題:爲什麼我有內存泄漏,有沒有辦法解決它而不刪除監聽器?

+0

內存泄漏的發生是因爲我在總線上有過時的監聽器佔用時間(他們仍然被調用)和空間。 – BPS 2013-04-10 16:13:22

+0

你應該在try-finally塊中包裝add-remove序列 – 2017-06-26 17:48:44