本节将对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方法。