Spring Boot 启动过程源码详解 (一)

详解 (一) 

程序启动入口到完成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 变量;

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值