购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.4 DelegatingApplicationContextInitializer分析

本节将对DelegatingApplicationContextInitializer进行分析,关于该对象的基础定义代码如下:

public class DelegatingApplicationContextInitializer
      implements ApplicationContextInitializer<ConfigurableApplicationContext>,
Ordered {}

从DelegatingApplicationContextInitializer的基础定义可以发现并未实现特殊接口,可以直接对ApplicationContextInitialize的实现方法进行分析,具体处理代码如下:

public void initialize(ConfigurableApplicationContext context) {
   // 获取环境对象
   ConfigurableEnvironment environment = context.getEnvironment();
   // 获取类
   List<Class<?>> initializerClasses = getInitializerClasses(environment);
   if (!initializerClasses.isEmpty()) {
      // 应用类
      applyInitializerClasses(context, initializerClasses);
   }
}

在上述代码中主要关注以下两个操作细节:

(1)获取类,具体处理方法是getInitializerClasses;

(2)应用类,具体处理方法是applyInitializerClasses。

下面对getInitializerClasses方法进行分析,具体处理代码如下:

private List<Class<?>> getInitializerClasses(ConfigurableEnvironment env) {
   // 从环境对象中获取类名集合
   String classNames = env.getProperty(PROPERTY_NAME);
   // 返回结果集合
   List<Class<?>> classes = new ArrayList<>();
   // 类名集合不为空的情况下会进行拆分
   if (StringUtils.hasLength(classNames)) {
         for (String className :StringUtils.tokenizeToStringArray(classNames,
",")) {
          // 当类型是ApplicationContextInitializer时会加入返回结果集合
          classes.add(getInitializerClass(className));
      }
   }
   return classes;
}

在getInitializerClasses方法中主要的处理流程如下:

(1)从环境对象中获取类名集合;

(2)创建返回结果集合;

(3)当类名集合不为空时会进行拆分,迭代每个类名,当类型是ApplicationContext-Initializer时将放入返回结果集合中。

完成getInitializerClasses分析后接下来对applyInitializerClasses方法进行分析,该方法用于执行ApplicationContextInitializer的initialize方法,详细代码如下:

    private void applyInitializerClasses(ConfigurableApplicationContext context,
List<Class<?>> initializerClasses) {
         // 获取上下文的类型
         Class<?> contextClass = context.getClass();
         // 创建ApplicationContextInitializer集合
         List<ApplicationContextInitializer<?>> initializers = new ArrayList<>();
         // 遍历initializerClasses,将其中元素实例化加入ApplicationContextInitializer集合
         for (Class<?> initializerClass :initializerClasses) {
             initializers.add(instantiateInitializer(contextClass, initializerClass));
         }
         // 执行ApplicationContextInitializer的方法
         applyInitializers(context, initializers);
    }

在applyInitializerClasses方法中主要的处理流程如下:

(1)创建ApplicationContextInitializer集合;

(2)遍历方法参数initializerClasses,将其中的元素进行实例化,实例化后放入ApplicationContextInitializer集合中;

(3)执行ApplicationContextInitializer集合的initialize方法。 31hwrxLxPK9s9DmkoJpQF9TZGCD4+yZ5eX2AoGlgKsEYJrqIKEt1oP42l2hBt0Uz

点击中间区域
呼出菜单
上一章
目录
下一章
×