SpringApplication启动逻辑

个人觉得这个也很重要的,顺便在这里参考“芋艿“的博客深入学习下底层源码,然后再配合一张图来帮助理解记忆。咱们的Spring Boot版本是1.5.9,所以您的版本里源码实现可能会有区别,但我觉得不同版本的Spring Boot整体思想应该差不多。

构造器

// sources数组仅仅包含一个元素: DemoApplication.class	
public SpringApplication(Object... sources) {
		initialize(sources);
	}
	
 private void initialize(Object[] sources) {
		if (sources != null && sources.length > 0) {
			this.sources.addAll(Arrays.asList(sources));
		}
     	// 判断是否是web环境,不同的spring boot版本,实现可能不一样
		this.webEnvironment = deduceWebEnvironment();
     	
     	// 设置ApplicationContextInitializer 
		setInitializers((Collection) getSpringFactoriesInstances(
				ApplicationContextInitializer.class));
     	// ApplicationListener List
		setListeners((Collection) 
                     getSpringFactoriesInstances(ApplicationListener.class));
     	
		this.mainApplicationClass = deduceMainApplicationClass();
}

	public void setInitializers(
			Collection<? extends ApplicationContextInitializer<?>> initializers) {
		this.initializers = new ArrayList<ApplicationContextInitializer<?>>();
		this.initializers.addAll(initializers);
	}
	
	public void setListeners(Collection<? extends ApplicationListener<?>> listeners) {
		this.listeners = new ArrayList<ApplicationListener<?>>();
		this.listeners.addAll(listeners);
	}


	// 下面是SpringApplication 类的一些属性

	private ConfigurableEnvironment environment;

	private Class<? extends ConfigurableApplicationContext> applicationContextClass;

	private boolean webEnvironment;

	private List<ApplicationContextInitializer<?>> initializers;

	private List<ApplicationListener<?>> listeners;

复制代码

![](liutianruo-2019-go-go-go.oss-cn-shanghai.aliyuncs.com/notes/02_Sp… Application构造器.png)

run()

这就是启动Spring Boot最核心的代码了,正菜来了哦。

	public ConfigurableApplicationContext run(String... args) {
        // 用来配合日志统计启动时间的
		StopWatch stopWatch = new StopWatch();
		stopWatch.start();
        
		ConfigurableApplicationContext context = null;
		FailureAnalyzers analyzers = null;
        // awt相关,可忽略
		configureHeadlessProperty();
        // 获得 SpringApplicationRunListeners(封装了多个SpringApplicationRunListener) 
		SpringApplicationRunListeners listeners = getRunListeners(args);
        // 启动监听
		listeners.starting();
        
		try {
            //创建  ApplicationArguments 对象
			ApplicationArguments applicationArguments = new DefaultApplicationArguments(
					args);
            	
            //  加载属性配置。执行完成后,所有的 environment 的属性都会加载进来,包括 application.properties 和外部的属性配置
			ConfigurableEnvironment environment = prepareEnvironment(listeners,
					applicationArguments);
            // 不重要,就控制台显示 Spring Boot 图案的,吉祥物属于是
			Banner printedBanner = printBanner(environment);
            // Spring上下文
			context = createApplicationContext();
            // 异常报告器
			analyzers = new FailureAnalyzers(context);
            // 调用所有初始化类的 initialize
			prepareContext(context, environment, listeners, applicationArguments,
					printedBanner);
            // 初始化spring上下文
			refreshContext(context);
            //执行 Spring 上下文的初始化的后置逻辑
			afterRefresh(context, applicationArguments);
            // 通知监听器,spring上下文启动完成
			listeners.finished(context, null);
            // 统计时长结束
			stopWatch.stop();
            
			if (this.logStartupInfo) {
				new StartupInfoLogger(this.mainApplicationClass)
						.logStarted(getApplicationLog(), stopWatch);
			}
			return context;
		}
		catch (Throwabl
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值