如何避免Spring上下文ApplicationListener干扰子上下文初始化?

时间:2016-01-05 13:54:18

标签: java spring

我有一个父上下文,我已经在web.xml中引导到我的servlet:

<servlet>
    <servlet-name>Outflow</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>com.fmr.bpo.asyncprocessingframework.invocator.wiring.configuration.pojo.common.RootConfig</param-value>
    </init-param>
    <init-param>
      <param-name>contextClass</param-name>
      <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </init-param>
</servlet>

由于我只能在加载和设置子上下文之后初始化子上下文,所以我通过实现ApplicationListener<ContextRefreshedEvent>来监听这个父上下文。

一旦父上下文加载,我的监听器onApplicationEvent触发,我将不同的环境连接到子上下文并加载它们:

public void onApplicationEvent(ContextRefreshedEvent event) {
    for(String infoKey : clientConfig.getPairs().keySet()) {
        PairInfo info = clientConfig.getPairs().get(infoKey);
        createChildContext(info);
    }
}

private void createChildContext(ListenerInfo info) {
    Properties properties = info.getProperties();
    StandardEnvironment environment = new StandardEnvironment();
    environment.getPropertySources().addLast(new PropertiesPropertySource("infoprops", properties));
    AnnotationConfigApplicationContext child = new AnnotationConfigApplicationContext();
    child.register(InboundFlow.class);
    child.setId(properties.getProperty("id"));
    child.setParent(context);
    child.setEnvironment(environment);
    child.refresh();
}

问题在于每次刷新子上下文时,都会再次调用同一个侦听器(因为它实现了ApplicationListener<ContextRefreshedEvent>)。每次上下文加载时它都变成一个无限循环,onApplicationEvent创建另一个子上下文,再次调用事件方法。

如何通过只监听父上下文而不是所有上下文来避免这种情况?或者我还有其他方式来初始化我的孩子情境吗?

提前感谢您的帮助。

0 个答案:

没有答案