系统初始化器通过SpringFactoriesLoader被spring容器识别和注入注入流程:
1.通过类加载器加载所有jar包下和项目下META-INF/spring.factories配置信息
2.用List<ApplicationContextInitializer<?>>保存实现了ApplicationContextInitializer接口的类全路径名
3.通过反射实例化List<ApplicationContextInitializer<?>>保存的类全路径名
4.将实例化的对象保存在SpringApplication类下的private List<ApplicationContextInitializer<?>> initializers
5.DelegatingApplicationContextInitializer是springBoot的jar下META-INF/spring.factories配置的,order为0优先级别最高,它会扫描环境配置信息中的context.initializer.classes,如果context.initializer.classes有配置系统初始化器,它会通过反射方法加载此系统化初始化器到容器,这就是第三种系统初始化器配置方法。
第一步:系统初始化器通过SpringFactoriesLoader被spring容器识别和注入
1. main方法进入SpringApplication.run(XyApplication.class, args)
2.调用同名方法run进入SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources)实例化构造函数
3.在第2步的构造函数中调setInitializers
4.用 Set<String> 保存所有META-INF/spring.factories下配置的value
5.通过反射实例化对象,然后排序
6.把实例化的对象用private List<ApplicationContextInitializer<?>> initializers保存起来
系统初始化器被调用
1.启动时通过调用run方法调用SpringApplication.applyInitializers方法
2.获取到启动时先前保存 的private List<ApplicationContextInitializer<?>> initializers
3.遍历这些系统初始化器,判断它的泛型是什么
4.然后判断它的泛型是不是ConfigurableApplicationContext的子类
5.执行系统初始化器重写的initialize方法