SpringBoot启动流程源码级解析 (二)

大家好,我是富贵,今天继续为大家带来SpringBoot启动流程源码级详解。

那么书接上回,在上一篇文章中我们已经说明了SpringBoot中的run()方法执行的主要流程就是创建SpringApplication并运行SpringApplication,并且在上篇文章中我们也已经分析了SpringApplication的创建流程,那么下面就让我们来看看SpringApplication是怎么运行的吧!

运行SpringApplication

创建引导上下文(Context环境)createBootstrapContext()获取所有的运行监听器保存命令行参数准备环境prepareEnvironment(listeners, applicationArguments);
private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments) { // 创建或获取环境 ConfigurableEnvironment environment = getOrCreateEnvironment(); /**配置环境 1.先配置addConversionService(类型转换器),用来转换配置文件中的配置 2.configurePropertySources()加载外部的配置源,读取所有配置源的配置属性值 3.configureProfiles(environment,args);将读取额外环境配置文件中的配置,添加并激活到环境中 **/ configureEnvironment(environment, applicationArguments.getSourceArgs()); //将环境绑定 ConfigurationPropertySources.attach(environment); //监听器调用environmentPrepared();通知所有监听器:当前环境准备完成 listeners.environmentPrepared(environment); //绑定 bindToSpringApplication(environment); if (!this.isCustomEnvironment) { environment=new EnvironmentConverter(getClassLoader()).convertEnvironmentIfNecessary(environment, deduceEnvironmentClass()); } ConfigurationPropertySources.attach(environment); return environment; }
创建IOC容器 createApplicationContext() –>这是整个过程中最重要的一步,就是根据项目类型(Servlet)创建对应的容器,并保存准备IOC容器信息 prepareContext()
private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment,SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments, Banner printedBanner) { //IOC容器保存环境信息 context.setEnvironment(environment); //IOC容器的后置处理流程:包括注册单例实例,添加资源加载器XxxLoader,添加类型转换器aConversionService postProcessApplicationContext(context); //应用初始化器:获取创建SpringApplication时从spring.factories文件中加载的ApplicationContextInitializer //初始化器,并调用他们的initialize()方法,对IOC容器进行初始化扩展功能 applyInitializers(context); //所有的监听器调用contextPrepared(),通知所有的监听器容器准备完成 listeners.contextPrepared(context); if (this.logStartupInfo) { logStartupInfo(context.getParent() == null); logStartupProfileInfo(context); } // Add boot specific singleton beans ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); //将命令行指令集作为一个bean组件添加 beanFactory.registerSingleton(“springApplicationArguments”, applicationArguments); //注册banner组件,加载banner图形 if (printedBanner != null) { beanFactory.registerSingleton(“springBootBanner”, printedBanner); } if (beanFactory instanceof DefaultListableBeanFactory) { ((DefaultListableBeanFactory) beanFactory) .setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding); } if (this.lazyInitialization) { context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor()); } // Load the sources Set<Object> sources = getAllSources(); Assert.notEmpty(sources, “Sources must not be empty”); load(context, sources.toArray(new Object[0])); //所有监听器调用contextLoaded(),通知所有的监听器IOC容器加载完成 listeners.contextLoaded(context); }
刷新IOC容器 : refreshContext()调用所有监听器的running()方法,通知所有监听器,IOC容器running若有异常,调用 : listeners.failed(context, exception);通知监听器failed

好啦,以上就是SpringApplication运行的全过程啦,希望对各位小伙伴能够起到些许帮助。

双击不迷路,您的鼓励就是我们不断前进的动力!

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片