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

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

时间:2023-04-01 15:11:26 Java

创建IOC容器createApplicationContext()protectedConfigurableApplicationContextcreateApplicationContext(){returnthis.applicationContextFactory.create(this.webApplicationType);}=============根据当前应用类型(Servlet)创建容器//当前会创建AnnotationConfigServletWebServerApplicationContextApplicationContextFactoryDEFAULT=(webApplicationType)->{try{switch(webApplicationType){caseSERVLET:返回新的AnnotationConfigServletWebServerApplicationContext();默认值:返回新的AnnotationConfigApplicationContext();}}catch(Exceptionex){thrownewIllegalStateException("无法创建默认的ApplicationContext实例,"+"您可能需要一个自定义的ApplicationContextFactory",ex);}};准备ApplicationContextIOC容器的基本信息prepareContext()privatevoidprepareContext(DefaultBootstrapContextbootstrapContext,ConfigurableApplicationContextcontext,ConfigurableEnvironmentenvironment,SpringApplicationRunListenerslisteners,ApplicationArgumentsapplicationArguments,Banner){保存之前的环境printedBannersetEnvironment(environment);//IOC容器的后处理过程postProcessApplicationContext(上下文);//应用初始化器:applyInitializersapplyInitializers(context);//遍历所有的监听器,调用contextPrepared//ioc容器的环境准备好了(contextPrepared方法源码在下面)listeners.contextPrepared(context);//bootcontext的环境关闭bootstrapContext.close(context);如果(this.logStartupInfo){logStartupInfo(context.getParent()==null);logStartupProfileInfo(上下文);}//添加引导特定的单例bean//获取bean工厂ConfigurableListableBeanFactorybeanFactory=context.getBeanFactory();//注册单个实例beanFactory.registerSingleton("springApplicationArguments",applicationArguments);//打印横幅if(printedBanner!=null){beanFactory.registerSingleton("springBootBanner",printedBanner);}if(beanFactoryinstanceofDefaultListableBeanFactory){((DefaultListableBeanFactory)beanFactory).setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);}if(this.lazyInitialization){context.addBeanFactoryPostProcessor(newLazyInitializationBeanFactoryPostProcessor());}//加载资源Setsources=getAllSources();Assert.notEmpty(sources,"来源不能为空");加载(上下文,sources.toArray(新对象[0]));//listeners:监听器listeners.contextLoaded(context);}==================postProcessApplicationContext(context);protectedvoidpostProcessApplicationContext(ConfigurableApplicationContextcontext){if(this.beanNameGenerator!=null){//注册组件context.getBeanFactory().registerSingleton(AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR,this.beanNameGenerator);}if(this.resourceLoader!=null){//读取配置文件的资源if(contextinstanceofGenericApplicationContext){((GenericApplicationContext)context).setResourceLoader(this.resourceLoader);}if(contextinstanceofDefaultResourceLoader){//资源加载器((DefaultResourceLoader)context).setClassLoader(this.resourceLoader.getClassLoader());}}//准备类型转换器if(this.addConversionService){context.getBeanFactory().setConversionService(ApplicationConversionService.getSharedInstance());}}===================applyInitializers(context)protectedvoidapplyInitializers(ConfigurableApplicationContextcontext){//遍历所有的ApplicationContextInitializer调用初始化。初始化ioc容器扩展函数为(ApplicationContextInitializerinitializer:getInitializers()){//从spring.factories中找到的七个InitializerClassrequiredType=GenericTypeResolver.resolveTypeArgument(initializer.getClass(),ApplicationContextInitializer.class);Assert.isInstanceOf(requiredType,context,“无法调用初始值设定项。”);initializer.initialize(上下文);}}@Overridepublicvoidinitialize(ConfigurableApplicationContextcontext){ConfigurableEnvironmentenvironment=context.getEnvironment();List>initializerClasses=getInitializerClasses(environment);//如果initializerClasses不为空,则实例化它们。如果(!initializerClasses.isEmpty()){applyInitializerClasses(context,initializerClasses);}}===========contextPrepared()voidcontextPrepared(ConfigurableApplicationContextcontext){doWithListeners("spring.boot.application.context-prepared",(listener)->listener.contextPrepared(context));}privatevoiddoWithListeners(StringstepName,ConsumerlistenerAction){doWithListeners(stepName,listenerAction,null);}privatevoiddoWithListeners(StringstepName,ConsumerlistenerAction,ConsumerstepAction){StartupStepstep=this.applicationStartup.start(stepName);//获取所有的监听器//其实就是EventPublishRunListenr:通知所有的监听器contextPrepared容器的上下文已经准备好了this.listeners.forEach(listenerAction);如果(stepAction!=null){stepAction.accept(步骤);}step.end();}================contextLoaded()voidcontextLoaded(ConfigurableApplicationContextcontext){doWithListeners("spring.boot.application.context-loaded",(listener)->listener.contextLoaded(context));}privatevoiddoWithListeners(StringstepName,ConsumerlistenerAction){doWithListeners(stepName,listenerAction,null);}privatevoiddoWithListeners(StringstepName,ConsumerlistenerAction,ConsumerStartupStep>stepAction){StartupStepstep=this.applicationStartup.start(stepName);//所有监听器调用contextLoaded(context)//通知所有监听器contextLoaded;容器的上下文已经加载了this.listeners。对于每个(listenerAction);如果(stepAction!=null){stepAction.accept(步骤);}step.end();}(listener)->listener.contextLoaded(context)