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

8.1,SpringBoot启动流程--把spring应用跑起来

时间:2023-04-02 01:05:28 Java

刷新IOC容器refreshContextprivatevoidrefreshContext(ConfigurableApplicationContextcontext){if(this.registerShutdownHook){try{context.registerShutdownHook();}catch(AccessControlExceptionex){//在某些环境中不允许。}}//spring的核心源代码refresh((ApplicationContext)context);}==============进入refresh((ApplicationContext)context);@Deprecatedprotectedvoidrefresh(ApplicationContextapplicationContext){Assert.isInstanceOf(ConfigurableApplicationContext.class,applicationContext);刷新((ConfigurableApplicationContext)applicationContext);}protectedvoidrefresh(ConfigurableApplicationContextapplicationContext){applicationContext.refresh();}@Overridepublicfinalvoidrefresh()throwsBeansException,IllegalStateException{try{super.refresh();}catch(RuntimeExceptionex){WebServerwebServer=this.webServer;if(webServer!=null){webServer.stop();}扔前;}}//springioc容器的经典的初始化过程publicvoidrefresh()throwsBeansException,IllegalStateException{Objectvar1=this.startupShutdownMonitor;同步(this.startupShutdownMonitor){StartupStepcontextRefresh=this.applicationStartup.start(“spring.context.refresh”);this.prepareRefresh();ConfigurableListableBeanFactorybeanFactory=this.obtainFreshBeanFactory();this.prepareBeanFactory(beanFactory);尝试{this.postProcessBeanFactory(beanFactory);StartupStepbeanPostProcess=this.applicationStartup.start("spring.context.beans.post-process");this.invokeBeanFactoryPostProcessors(beanFactory);这个.registerBeanPostProcessors(beanFactory);beanPostProcess.end();this.initMessageSource();this.initApplicationEventMulticaster();这个.onRefresh();这个.registerListeners();//实例化容器中所有的组件this.finishBeanFactoryInitialization(beanFactory);这个.finishRefresh();}catch(BeansExceptionvar10){if(this.logger.isWarnEnabled()){this.logger.warn("上下文初始化期间遇到异常-取消刷新尝试:"+var10);}this.destroyBeans();this.cancelRefresh(var10);抛出var10;}最后{this.resetCommonCaches();contextRefresh.end();}}}callRunners(context,applicationArguments)privatevoidcallRunners(ApplicationContextcontext,ApplicationArgumentsargs){//准备runners集合Listrunners=newArrayList<>();//getBeansOfType:根据类型获取组件CommandLineRunner,ApplicationRunnerrunners.addAll(context.getBeansOfType(ApplicationRunner.class.值());runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());//合并所有跑者,按照@OrderAnnotationAwareOrderComparator.sort(runners)排序;//遍历所有跑步者调用各个运行方法for(Objectrunner:newLinkedHashSet<>(runners)){if(runnerinstanceofApplicationRunner){callRunner((ApplicationRunner)runner,args);}if(runnerinstanceofCommandLineRunner){callRunner((CommandLineRunner)runner,args);}}}@FunctionalInterfacepublicinterfaceApplicationRunner{/***用于运行bean的回调。*@paramargs传入的应用程序参数*@throwsExceptiononerror*/voidrun(ApplicationArgumentsargs)throwsException;}@FunctionalInterfacepublicinterfaceCommandLineRunner{/***用于运行bean的回调。*@paramargs传入主方法参数*@throwsExceptiononerror*/voidrun(String...args)throwsException;}handleRunFailure(context,ex,listeners);privatevoidhandleRunFailure(ConfigurableApplicationContextcontext,Throwableexception,SpringApplicationRunListeners监听器){try{try{handleExitCode(context,exception);if(listeners!=null){//调用listeners.failed(context,exception);listeners.failed(上下文,异常);}}最后{reportFailure(getExceptionReporters(context),exception);if(context!=null){context.close();}}}catch(Exceptionex){logger.warn("无法关闭ApplicationContext",ex);}ReflectionUtils.rethrowRuntimeException(异常);}//如果有异常,继续捕获异常handleRunFailure(context,ex,null);privatevoidhandleRunFailure(ConfigurableApplicationContextcontext,Throwableexception,SpringApplicationRunListenerslisteners){try{try{handleExitCode(context,ex接受);if(listeners!=null){//运行中如果有问题,继续通知失败。//所有Listener调用失败;notifyalllistenersoffailed当前项目运行失败listeners.failed(context,exception);}}最后{reportFailure(getExceptionReporters(context),exception);if(context!=null){context.close();}}}catch(Exceptionex){记录器。warn("无法关闭ApplicationContext",ex);反射实用程序。rethrowRuntimeException(异常);}