本节将对ParentContextApplicationContextInitializer进行分析,该类主要用于设置父上下文。下面对ParentContextApplicationContextInitializer成员变量进行说明,详细内容见表4-1。
表4-1 ParentContextApplicationContextInitializer成员变量
在了解成员变量后,我们来关注该对象的基础定义代码:
public class ParentContextApplicationContextInitializer Implements ApplicationContextInitializer<ConfigurableApplicationContext>, Ordered {}
在基础定义中可以发现它实现了ApplicationContextInitializer,关于该接口的实现方法代码如下:
public void initialize(ConfigurableApplicationContext applicationContext) { if (applicationContext != this.parent) { applicationContext.setParent(this.parent); applicationContext.addApplicationListener(EventPublisher.INSTANCE); } }
在这段代码中会判断传入的参数应用上下文是否等于成员变量父上下文,如果不相等会将当前成员变量父上下文设置给参数应用上下文,设置完成后会添加一个应用监听器,应用监听器的具体类型是EventPublisher,关于该应用监听器的代码如下:
在这个应用监听器中会推送一个事件,事件类型是ParentContextAvailableEvent。在Spring Boot中关于ParentContextAvailableEvent事件有一个对应的事件处理器,它是ParentContextCloserApplicationListener,接下来将对其进行分析。关于该对象的基础定义代码如下:
public class ParentContextCloserApplicationListener implements ApplicationListener<ParentContextAvailableEvent>, ApplicationContextAware, Ordered {}
通过前文的分析知道它是一个应用监听器,因此本节主要关注onApplicationEvent方法,详细代码如下:
public void onApplicationEvent(ParentContextAvailableEvent event) { // 向父类添加应用监听器 maybeInstallListenerInParent(event.getApplicationContext()); } private void maybeInstallListenerInParent(ConfigurableApplicationContext child) { if (child = = this.context && child.getParent() instanceof ConfigurableApplicationContext) { ConfigurableApplicationContext parent = (ConfigurableApplicationContext) child.getParent(); parent.addApplicationListener(createContextCloserListener(child)); } }
在这段代码中可以发现,当满足下面条件时会向父应用上下文添加一个应用监听器,条件信息如下:
(1)方法参数child和成员变量应用上下文相同;
(2)方法参数child的父上下文类型是ConfigurableApplicationContext。
在上述操作过程中所涉及的应用监听器(事件监听器)是ContextCloserListener,与之对应的事件是ContextClosedEvent,关于时间的处理代码如下:
public void onApplicationEvent(ContextClosedEvent event) { ConfigurableApplicationContext context = this.childContext.get(); if ((context != null) && (event.getApplicationContext() == context. getParent()) && context.isActive()) { context.close(); } }
在这个事件处理方法中,主要行为是将应用上下文关闭。至此,对于ParentContextApplicationContextInitializer的分析就告一段落,接下来将进入ConditionEvaluationReportLoggingListener的分析中。