SpringBoot启动流程我们简单的先介绍一下SpringBoot的启动流程都需要哪些步骤1。加载配置文件2。准备上下文环境3。创建上下文对象4。启动spring5。启动tomcat 我们先来看一下springboot的启动流程图 SpringBoot启动流程图 下面附上源码,我们从SpringApplication。run(WebApplicaiton。class,args);开始进入 找到SpringApplication下的run方法。在代码中都有注释标注,相信大家都可以看懂publicConfigurableApplicationContextrun(String。。。args){longstartTimeSystem。nanoTime();DefaultBootstrapContextbootstrapContextcreateBootstrapContext();ConfigurableApplicationC设置了一个名为java。awt。headless的系统属性configureHeadlessProperty();获取监听器所有实现SpringApplicationRunListener这个接口的监听器SpringApplicationRunListenerslistenersgetRunListeners(args);调用监听器里所有写的starting方法listeners。starting(bootstrapContext,this。mainApplicationClass);try{ApplicationArgumentsapplicationArgumentsnewDefaultApplicationArguments(args);准备上下文的环境ConfigurableEnvironmentenvironmentprepareEnvironment(listeners,bootstrapContext,applicationArguments);configureIgnoreBeanInfo(environment);启动的图标BannerprintedBannerprintBanner(environment);创建上下文的对象contextcreateApplicationContext();context。setApplicationStartup(this。applicationStartup);prepareContext(bootstrapContext,context,environment,listeners,applicationArguments,printedBanner);进入到spring的容器方法refreshContext(context);afterRefresh(context,applicationArguments);DurationtimeTakenToStartupDuration。ofNanos(System。nanoTime()startTime);if(this。logStartupInfo){newStartupInfoLogger(this。mainApplicationClass)。logStarted(getApplicationLog(),timeTakenToStartup);}调用了监听器的started方法listeners。started(context,timeTakenToStartup);callRunners(context,applicationArguments);}catch(Throwableex){handleRunFailure(context,ex,listeners);thrownewIllegalStateException(ex);}try{计算springboot启动耗时DurationtimeTakenToReadyDuration。ofNanos(System。nanoTime()startTime);执行监听器的ready方法listeners。ready(context,timeTakenToReady);}catch(Throwableex){handleRunFailure(context,ex,null);thrownewIllegalStateException(ex);}} 我们再走到prepareContext方法中privatevoidprepareContext(DefaultBootstrapContextbootstrapContext,ConfigurableApplicationContextcontext,ConfigurableEnvironmentenvironment,SpringApplicationRunListenerslisteners,ApplicationArgumentsapplicationArguments,BannerprintedBanner){context。setEnvironment(environment);postProcessApplicationContext(context);applyInitializers(context);设置完环境变量监听器会调用的方法listeners。contextPrepared(context);bootstrapContext。close(context);if(this。logStartupInfo){logStartupInfo(context。getParent()null);logStartupProfileInfo(context);}AddbootspecificsingletonbeansConfigurableListableBeanFactorybeanFactorycontext。getBeanFactory();beanFactory。registerSingleton(springApplicationArguments,applicationArguments);if(printedBanner!null){beanFactory。registerSingleton(springBootBanner,printedBanner);}if(beanFactoryinstanceofAbstractAutowireCapableBeanFactory){((AbstractAutowireCapableBeanFactory)beanFactory)。setAllowCircularReferences(this。allowCircularReferences);if(beanFactoryinstanceofDefaultListableBeanFactory){((DefaultListableBeanFactory)beanFactory)。setAllowBeanDefinitionOverriding(this。allowBeanDefinitionOverriding);}}if(this。lazyInitialization){context。addBeanFactoryPostProcessor(newLazyInitializationBeanFactoryPostProcessor());}LoadthesourcesSetObjectsourcesgetAllSources();Assert。notEmpty(sources,Sourcesmustnotbeempty);load(context,sources。toArray(newObject〔0〕));调用监听器的contextLoaded方法listeners。contextLoaded(context);}然后我们找到refreshContext方法javaprivatevoidrefreshContext(ConfigurableApplicationContextcontext){if(this。registerShutdownHook){shutdownHook。registerApplicationContext(context);}refresh(context);} 进入到ServletWebServerApplicationContext类下的refresh方法Overridepublicfinalvoidrefresh()throwsBeansException,IllegalStateException{try{进入到了spring容器super。refresh();}catch(RuntimeExceptionex){WebServerwebServerthis。webSif(webServer!null){webServer。stop();}}} 我会在之后的文章中更新在springboot启动的过程中是如何加载配置以及tomcat是如何启动的。相信大家在结合流程图看源码一定会很清晰的