我想在运行时动态注册和注销Spring ApplicationListeners,而不是在Spring配置文件中注册和注销。
如果我无法动态删除它们,我会发生内存泄漏。
这是我最好的猜测:
我可以致电AbstractApplicationContext.getApplicationEventMulticaster().add/removeApplicationListener()
。
这是推荐的方法吗?
有没有人动态删除侦听器?
答案 0 :(得分:4)
以下作品。这对于实现ApplicationListener并经常创建/销毁的原型bean特别有用。如果您不注销它们,最终会导致内存泄漏。
ApplicationEventMulticaster aem = context.getBean(AbstractApplicationContext.APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
aem.removeApplicationListener(appListener);
答案 1 :(得分:1)
这可以使用AbstractApplicationEventMulticaster中的2种方法解决。 1.removeApplicationListenerBean(字符串listenerBeanName) 2.removeApplicationListener(ApplicationListener <?>监听器)
例如:
//Listener class.
@Component
public class CustomEventListener implements ApplicationListener <CustomEvent>{
@Override
public void onApplicationEvent(CustomEvent event) {
//Your logic goes here
}
}
//Event Publisher class
@Component
public class CustomEventListener {
@Autowired
private SimpleApplicationEventMulticaster multicaster;
@Autowired
private CustomEventListener listener;
public void doStuffAndPublishAnEvent(CustomEvent customEvent) {
multicaster.removeApplicationListener(listener);
multicaster.removeApplicationListenerBean(listener.getClass().getSimpleName());
multicaster.multicastEvent(customEvent);
}
注意:SimpleApplicationEventMulticaster扩展了AbstractApplicationEventMulticaster。 如果您有疑问,请在这里here
答案 2 :(得分:0)
我认为你推荐的方法很好。您还可以使用相同或类似的技术让听众自行删除。
但是我会问自己其他问题:为什么我有内存泄漏,有没有办法解决它而不删除监听器?