我有一个父上下文,我已经在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
创建另一个子上下文,再次调用事件方法。
如何通过只监听父上下文而不是所有上下文来避免这种情况?或者我还有其他方式来初始化我的孩子情境吗?
提前感谢您的帮助。