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

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

时间:2023-04-01 16:32:02 Java

start方法中的源码publicvoidstart()throwsIllegalStateException{this.start("");}publicvoidstart(StringtaskName)throwsIllegalStateException{if(this.currentTaskName!=null){thrownewIllegalStateException("无法启动秒表:它已经在运行");}else{//保存一些信息到stopWatch对象this.currentTaskName=taskName;//当前任务的名称this.startTimeNanos=System.nanoTime();//当前时间}createBootstrapContext创建Bootstrap上下文privateDefaultBootstrapContextcreateBootstrapContext(){//创建一个默认的bootstrapcontext对象//以后会在里面保存很多信息DefaultBootstrapContextbootstrapContext=newDefaultBootstrapContext();//遍历之前得到的所有bootstrapper,调用每个bootstrapper的initialize()完成设置引导程序上下文环境的this.bootstrappers.forEach((initializer)->initializer.intitialize(bootstrapContext));returnbootstrapContext;//null}================================================================publicinterfaceBootstrapper{/***使用任何所需的注册初始化给定的{@linkBootstrapRegistry}。*@paramregistrytheregistrytoinitialize*///Incomingbootstrapregistrationfactory//在这个factory中,可以向他添加当前context的一些bootstrap环境信息voidinitialize(BootstrapRegistryregistry);}让当前应用进入headless模式privatevoidconfigureHeadlessProperty(){System.setProperty(SYSTEM_PROPERTY_JAVA_AWT_HEADLESS,System.getProperty(SYSTEM_PROPERTY_JAVA_AWT_HEADLESS,Bootstrap.toString(this.headless)));}获取所有RunListeners(运行中的监听器)所谓监听器就是监听当前项目的状态privateSpringApplicationRunListenersgetRunListeners(String[]args){Class[]types=newClass[]{SpringApplication.class,String[].class};//newSpringApplicationRunListeners:相当于将找到的Listener保存到SpringApplicationRunListener中;returnnewSpringApplicationRunListeners(logger,//getSpringFactoriesInstances:到spring.factories中找到SpringApplicationRunListenergetSpringFactoriesInstances(SpringApplicationRunListener.class,types,this,args),this.applicationStartup);}======================================================SpringApplicationRunListeners(Loglog,Collectionlisteners,ApplicationStartupapplicationStartup){this.log=log;this.listeners=newArrayList<>(listeners);this.applicationStartup=applicationStartup;}Listlisteners;starting():遍历所有的SpringApplicationRunListener并调用starting方法;相当于通知所有感兴趣的人,系统正在启动进程,项目正在启动。(即告诉我项目正在开始)>{如果(mainApplicationClass!=null){step.tag("mainApplicationClass",mainApplicationClass.getName());}});}===========================================进入doWithListeners方法:privatevoiddoWithListeners(StringstepName,ConsumerlistenerAction,ConsumerstepAction){StartupStepstep=this.applicationStartup.start(stepName);//遍历所有的监听器,它们现在在哪一步,相当于一个事件消息this.listeners.forEach(listenerAction);如果(stepAction!=null){stepAction.accept(步骤);}步骤结束();}====================================输入this.listeners.forEach(listenerAction):voidstarting(ConfigurableBootstrapContextbootstrapContext,ClassmainApplicationClass){//遍历所有SpringApplicationRunListener调用启动方法doWithListeners("spring.boot.application.starting",(listener)->listener.starting(bootstrapContext),(step)->{if(mainApplicationClass!=null){step.tag("mainApplicationClass",mainApplicationClass.getName());}});}