前言如果不是说SpringBoot微框架提供了一些独到之处,在核心类层面,就是SpringApplication。为SpringBoot程序启动提供一站式解决方案。在没有特殊需求的情况下,默认模板化执行流程即可满足需求;但是如果有特殊的需求也没关系,SpringApplication在合适的流程节点处开启了一系列不同类型的扩展点,我们可以通过这些扩展点来扩展SpringBoot程序的启动和关闭流程。正文上一篇《Spring Boot核心运行原理神秘的面纱!》通过分析SpringApplication类实例化的代码,我们知道在这个过程中已经完成了基础配置文件的加载和实例化。创建SpringApplication对象后,通过调用run方法启动并运行SpringBoot。run方法的核心流程我们可以通过约定run方法的源码大致总结方法的主要流程如下:获取监听器和参数配置打印Banner创建并初始化容器监听器发送通知/***运行Spring应用,创建并刷新一个新的IOC容器并返回*/publicConfigurableApplicationContextrun(String...args){//创建一个对象,用于统计run方法的启动时间StopWatchstopWatch=newStopWatch();//启动stopWatch.start();//声明应用上下文ConfigurableApplicationContextcontext=null;//创建异常集合CollectionexceptionReporters=newArrayList<>();配置无头属性();SpringApplicationRunListeners监听器=getRunListeners(args);//开始监听listeners.starting();try{//创建应用启动参数ApplicationArgumentsapplicationArguments=newDefaultApplicationArguments(args);//加载所有配置属性ConfigurableEnvironmentenvironment=prepareEnvironment(listeners,applicationArguments);configureIgnoreBeanInfo(环境);//打印横幅BannerprintedBanner=printBan纳尔(环境);//创建容器context=createApplicationContext();//获取异常信息exceptionReporters=getSpringFactoriesInstances(SpringBootExceptionReporter.class,newClass[]{ConfigurableApplicationContext.class},context);//准备容器prepareContext(context,environment,listeners,applicationArguments,printedBanner);//初始化容器refreshContext(context);//初始化后运行afterRefresh(context,applicationArguments);//停止时长统计stopWatch.stop();//打印启动日志if(this.logStartupInfo){newStartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(),stopWatch);}//通知监听器容器启动完成listeners.started(context);//调用ApplicationRunner和CommandLineRunner方法callRunners(context,applicationArguments);}catch(Throwableex){//异常处理handleRunFailure(上下文,ex,exceptionReporters,听众);抛出新的IllegalStateException(ex);}try{//通知监听器容器正在运行listeners.running(context);}catch(Throwableex){//异常处理handleRunFailure(context,ex,exceptionReporters,null);抛出新的IllegalStateException(ex);}返回上下文;当然,run方法的运行过程除了核心操作外,还涉及到启动时间统计、异常、日志等辅助操作。深入探究执行过程SpirngBoot启动过程重点关注事件监控,初始化环境,容器创建和初始化操作。大致概括如下:收集并加载各种可用条件和回调接口,如ApplicationContextInitializer、ApplicationListener。调用他们的started()方法来通知他们:“SpringBoot应用程序即将开始执行”。创建并准备所有的Environments(配置属性),遍历并调用所有SpringApplicationRunListener的environmentPrepared()方法,通知它们:“当前SpringBoot应用使用的Environment已准备好”。创建并初始化ApplicationContext,例如:设置Environment、加载配置等。遍历并调用所有SpringApplicationRunListener的contextPrepared()方法,通知它们:“SpringBoot应用使用的ApplicationContext已准备好”。)遍历并调用所有SpringApplicationRunListener的contextLoaded()方法,通知所有SpringApplicationRunListenerApplicationContext已经“加载完毕”。调用ApplicationContext的refresh()方法完成IoC容器可用的最后一个进程。注册并执行CommandLineRunner。)一般情况下,遍历执行SpringApplicationRunListener的finished()方法,告诉他们:“OK!”。至此,一个完整的SpringBoot应用已经启动!综上所述,我们已经完成了对SpringBoot核心组件的基本分析。整体来看,大部分的东西都是Spring框架背后的一些原创理念和实践。SpringBoot在这些概念和实践上只是针对特定的场景。实现得到了固化和升华,也正是这些固化让我们基于Spring框架开发应用更加方便和高效。最后一篇为初学者提供学习指南,对从业者有参考价值。我坚信编码员也有能力产生洞察力。扫描下方二维码关注、学习、交流!