Spring Boot 启动过程源码详解
程序员文章站
2022-06-24 12:09:21
详解 (一)程序启动入口到完成SpringApplication构造器@SpringBootApplicationpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }}我们从上面的 main() 方法开始分析,进到 SpringApplication.run....
详解 (一)
程序启动入口到完成SpringApplication构造器
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
我们从上面的 main() 方法开始分析,进到 SpringApplication.run方法内
1. 调用静态方法 run() 及其重载方法
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
return run(new Class<?>[] { primarySource }, args);
}
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
//先执行当前类的构造器,再运行程序启动的run方法
return new SpringApplication(primarySources).run(args);
}
在重载方法我们会发现,代码会先执行 SpringApplication 类的构造器。先看下这个类的构造器具体做了那些步骤。
2. SpringApplication 构造器
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
// resourceLoader = null
this.resourceLoader = resourceLoader;
Assert.notNull(primarySources, "PrimarySources must not be null");
// 将启动类的Class(DemoApplication.class)赋值存入到 primarySources 变量
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
// 获取当前classloader的启动环境 这里为 servelet
this.webApplicationType = WebApplicationType.deduceFromClasspath();
// 按 Bootstrapper 接口,获取工厂接口实例
this.bootstrappers = new ArrayList<>(getSpringFactoriesInstances(Bootstrapper.class));
// 按 ApplicationContextInitializer 接口,获取实例,并赋值给变量SpringApplication.initializers
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
// 按 ApplicationListener 接口,获取实例,并赋值给变量SpringApplication.listeners
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
// ?待分析
this.mainApplicationClass = deduceMainApplicationClass();
}
从构造器内可发现里面会生成 ApplicationContextInitializer / ApplicationListener 实例,分析这一步具体做了什么
3. 如何获取 ApplicationContextInitializer / ApplicationListener
执行 this.getSpringFactoriesInstances() 方法,按beanfactoryType(工厂接口) ,通过类加载器 ClassLoader 从文件 spring.factories 将默认工厂接口及实现类加载到 SpringFactoriesLoader.cache 变量;
本文地址:https://blog.csdn.net/Jicogxy/article/details/110286135
上一篇: 高大上的迭代器