动态删除Spring ApplicationListener的最佳实践?

时间:2013-04-10 15:33:08

标签: java spring java-ee

我想在运行时动态注册和注销Spring ApplicationListeners,而不是在Spring配置文件中注册和注销。

如果我无法动态删除它们,我会发生内存泄漏。

这是我最好的猜测:

我可以致电AbstractApplicationContext.getApplicationEventMulticaster().add/removeApplicationListener()

这是推荐的方法吗?

有没有人动态删除侦听器?

3 个答案:

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

我认为你推荐的方法很好。您还可以使用相同或类似的技术让听众自行删除。

但是我会问自己其他问题:为什么我有内存泄漏,有没有办法解决它而不删除监听器?