当前位置: 首页 > 后端技术 > Java

8.1、SpringBoot启动流程--运行spring应用

时间:2023-04-01 18:29:32 Java

运行spring应用,开始进入run方法:publicstaticConfigurableApplicationContextrun(Class[]primarySources,String[]args){returnnewSpringApplication(primarySources).运行(参数);}stepintorun()publicConfigurableApplicationContextrun(String...args){//停止监听器,监听整个应用的启停StopWatchstopWatch=newStopWatch();//在start方法中源码可以看下面的代码显示stopWatch.start();//记录应用程序的启动时间//创建一个bootstrapcontext(xxxContext是一个bootstrap环境)DefaultBootstrapContextbootstrapContext=createBootstrapContext();//下面是createBootstrapContext方法的源码ConfigurableApplicationContextcontext=null;//让当前应用进入headless模式。源码在下面//(headless表示自力更生,不依赖他人)configureHeadlessProperty();//获取所有的RunListeners(运行监听器)并保存到SpringApplicationRunListeners中//【为了方便所有Listener感知事件】所谓监听器就是监听当前项目的状态SpringApplicationRunListenerslisteners=getRunListeners(args);//starting()源码分析在下面listeners.starting(bootstrapContext,this.mainApplicationClass);try{//准备ApplicationArguments应用参数,这里是从命令行传过来的。即保存命令行参数ApplicationArgumentsapplicationArguments=newDefaultApplicationArguments(args);//准备运行环境ConfigurableEnvironmentenvironment=prepareEnvironment(listeners,bootstrapContext,applicationArguments);//这行代码结束后,所有的环境信息就准备好了//Configuration一些要忽略的bean信息configureIgnoreBeanInfo(environment);//打印横幅(什么是横幅,见下文)BannerprintedBanner=printBanner(environment);//创建ioc容器(创建容器后,所有bean都会进去)context=createApplicationContext();//源码如下//保存启动信息context.setApplicationStartup(this.applicationStartup);//准备ioc容器环境的信息(源码在下面)prepareContext(bootstrapContext,context,environment,listeners,applicationArguments,printedBanner);//刷新ioc容器(方法源码如下)refreshContext(context);//================至此,ioc容器创建完毕===================//容器刷新afterRefr后要做的工作esh(上下文,applicationArguments);//监控所有容器都启动了stopWatch.stop();如果(this.logStartupInfo){newStartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(),stopWatch);}//遍历所有的监听调用listeners.started(context);//通知所有监听器started项目已经启动(通知监听器另一个任务已经完成)所以这里可以访问8080listeners.started(context);//调用所有运行器callRunners(context,applicationArguments);}catch(Throwableex){//如果有异常,也会捕获异常(捕获源码在下面)handleRunFailure(context,ex,listeners);抛出新的IllegalStateException(ex);}try{//无一例外地调用所有监听器的running方法listeners.running(context);//通知所有的监听器,正在运行的项目已经进入运行状态listeners.running(context);}catch(Throwableex){//如果有异常,继续捕获异常handleRunFailure(context,ex,null);抛出新的IllegalStateExc选项(前);}返回上下文;}横幅:。_________/\\/___'_____(_)______\\\(()\___|'_|'_||'_\/_`|\\\\\/___)||_)|||||||(_||)))'|____|.__|_||_|_||_\__,|////=========|_|==============|___/=/_/_/_/::SpringBoot::(v2.4.0)