欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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