构造方法初始化,创建一个新的实例,这个应用程序的上下文要从指定的来源加载bean
public SpringApplication(ResourceLoaderresourceLoader,Class<?>...primarySources){
this.sources=newLinkedHashSet();
this.bannerMode=Mode.CONSOLE;
this.logStartupInfo=true;
this.addCommandLineProperties=true;
this.headless=true;
this.registerShutdownHook=true;
this.additionalProfiles=newHashSet();
初始化资源加载器,默认为null
this.resourceLoader=resourceLoader;
断言要加载的资源类不能为null否则报错
Assert.notNull(primarySources,"Primary Sources must not be null");
初始化主要加载资源并去重
this.primarySources=newLinkedHashSet(Arrays.asList(primarySources));
判断当前应用程序的类型 NONE/SERVLET/REACTIVE
this.webApplicationType=this.deduceWebApplicationType();
加载所有的初始化容器,设置应用上下文初始化器,从"META-INF/spring.factories"读取ApplicationContextInitializer类的实例名称集合并去重,并进行set去重。(一共5个)
this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
设置监听器,从"META-INF/spring.factories"读取ApplicationListener类的实例名称集合并去重,并进行set去重。(一共10个)
this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
推断主入口应用类,通过当前调用栈,获取Main方法所在类,并赋值给mainApplicationClass
this.mainApplicationClass=this.deduceMainApplicationClass();
}
启动流程
springboot启动的运行方法,可以看到主要是各种运行环境的准备工作
public ConfigurableApplicationContext run(String...args){
创建并启动计时监控类
设置当前任务的id和启动的时间,方便后续的时候进行计时的操作
StopWatch stopWatch=new StopWatch();
stopWatch.start();
初始化上下文
初始化异常报告集合
ConfigurableApplicationContext context=null;
Collection<SpringBootExceptionReporter> exceptionReporters=new ArrayList();
设置系统属性“java.awt.headless”
默认为true,用于运行headless服务器,进行简单的图像处理,多用于在缺少显示屏、键盘或者鼠标时的系统配置,很多监控工具如jconsole 需要将该值设置为true
this.configureHeadlessProperty();
注册linsteners,创建所有spring运行监听器并发布应用启动事件,简单说的话就是获取SpringApplicationRunListener类型的实例(EventPublishingRunListener对象),并封装进SpringApplicationRunListeners对象,然后返回这个SpringApplicationRunListeners对象。说的再简单点,getRunListeners就是准备好了运行时监听器EventPublishingRunListener。
记载spring.factoris文件中的你内容
获取文件中对应类的全路径
根据反射得到具体的实体类对象
生成对应的对象之后再返回给调用者
SpringApplicationRunListeners listeners=this.getRunListeners(args);
每次监听器在实际做操作的时候都会执行listeners.starting()
this.initialMulticaster.multicastEvent
匹配不同类型的事件,然后从所有的监听器中把不符合条件的监听给过滤掉
符合条件的监听器会循环执行具体的自己的处理逻辑
listeners.starting(); try{
初始化默认参数应用类
加载命令行的参数值,解析在命令行中通过--key=value输入的属性值,封装到ApplicationArguments对象中
ApplicationArguments applicationArguments=new DefaultApplicationArguments(args);
根据运行监听器和应用参数来准备spring环境
ConfigurableEnvironment environment=this.prepareEnvironment(listeners,applicationArguments);
设置系统属性,保证某些bean不会添加到准备的环境中(设置忽略的参数)
this.configureIgnoreBeanInfo(environment);
创建banner打印类
Banner printedBanner=this.printBanner(environment);
创建应用上下文对象,根据当前应用类型选择创建什么类型的上下文 servlet,reactive,none
context=this.createApplicationContext();
设置异常报告对象,用来支持报告关于启动的错误
this.getSpringFactoriesInstances(SpringBootExceptionReporter.class,newClass[]{ConfigurableApplicationContext.class},context);
准备当前上下文对象,包含一个关键操作,将启动类注入容器,为后续开启自动化提供基础
设置初始化进行执行,向beanfactory中注入了三个postprocessor的对象,后续在自动装配的时候会用到applyInitializers(context);
listeners.contextPrepared(context);
加载很多资源配置,自动装配在此环节完成load(context, sources.toArray(new Object[0]));
listeners.contextLoaded(context);
this.prepareContext(context,environment,listeners,applicationArguments,printedBanner);
刷新应用上下文
this.refreshContext(context);
应用上下文刷新后置操作做一些扩展功能
this.afterRefresh(context,applicationArguments);
计时结束,并打印程序所用时长
stopWatch.stop();
输出日志,记录执行的主类目和事件信息
if(this.logStartupInfo){
(newStartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(),stopWatch);
}
启动所有的监听器对象
listeners.started(context);
执行所有的runner运行器
this.callRunners(context,applicationArguments);
}catch(Throwablevar9){
处理失败的操作
this.handleRunFailure(context,listeners,exceptionReporters,var9);
thrownewIllegalStateException(var9);
}
启动完成调用,发布应用上下文就绪事件
listeners.running(context);
返回应用上下文
return context;
}

springboot执行流程的更多相关文章

  1. SpringBoot项目构建、测试、热部署、配置原理、执行流程

    SpringBoot项目构建.测试.热部署.配置原理.执行流程 一.项目构建 二.测试和热部署 三.配置原理 四.执行流程

  2. SpringBoot启动流程解析

    写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ...

  3. Spring Boot程序的执行流程

    Spring Boot的执行流程如下图所示:(图片来源于网络) 上图为SpringBoot启动结构图,我们发现启动流程主要分为三个部分,第一部分进行SpringApplication的初始化模块,配置 ...

  4. Spring Security Oauth2 单点登录案例实现和执行流程剖析

    Spring Security Oauth2 OAuth是一个关于授权的开放网络标准,在全世界得到的广泛的应用,目前是2.0的版本.OAuth2在“客户端”与“服务提供商”之间,设置了一个授权层(au ...

  5. Spring Security 案例实现和执行流程剖析

    Spring Security Spring Security 是 Spring 社区的一个顶级项目,也是 Spring Boot 官方推荐使用的安全框架.除了常规的认证(Authentication ...

  6. SpringBoot启动流程分析(六):IoC容器依赖注入

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  7. SpringBoot启动流程分析(二):SpringApplication的run方法

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  8. SpringBoot启动流程分析(三):SpringApplication的run方法之prepareContext()方法

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  9. SpringBoot启动流程分析(四):IoC容器的初始化过程

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

随机推荐

  1. Golang | 测试与性能调优

    Test 我们在日常的工作过程中,自测是不可缺少的,公司还会要求所有的公共方法必须要写单测,在别的语言中,我们如果想要写单测还需要使用到测试框架,但是Go语言中,直接支持测试,并且使用起来非常简单. ...

  2. Spring Boot-@Value获取值和@ConfigurationProperties获取值的比较

    @Value和@ConfigurationProperties都是用于属性的注入(相当于spring中<bean id=" " class=" "> ...

  3. 3道常见的vue面试题,你都会了吗?

    最近流传各大厂纷纷裁员,导致很多人"被迫"毕业,显然很多人还是想留级,无奈出现在名单中,只能感叹命运不公,不过拿了N+1,也算是很欣慰. 又得去面试了,接下来一起来巩固下vue的3 ...

  4. Msf路由转发

    Msf路由转发 前言 在内网渗透中,我们拿下了一台机器A的权限,再通过A做一个跳板来做横向渗透,这时我们对于内网中的其他机器是无法连接的.我们在A上做横向渗透是很困难的,因为在这台机器一般为web服务 ...

  5. JS_进阶-遍历对象属性、数组输出、Math、正则表达式匹配

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  6. C# iText 7 切分PDF,处理PDF页面大小

    一.itext 我要使用itext做一个pdf的页面大小一致性处理,然后再根据数据切分出需要的pdf. iText的官网有关于它的介绍,https://itextpdf.com/ 然后在官网可以查找a ...

  7. socket编程实现tcp服务器_C/C++

    1. 需求分析 实现一个回声服务器的C/S(客户端client/服务器server)程序,功能为客户端连接到服务器后,发送一串字符串,服务器接受信息后,返回对应字符串的大写形式给客户端显示. 例如: ...

  8. iNeuOS工业互联网操作系统,数据点、设备和业务的计算与预警

    目       录 1.      概述... 2 2.      概念解释... 2 3.      数据点的计算与预警... 2 4.      设备的计算与预警... 3 5.      业务的 ...

  9. 1.8 常见Linux发行版本有哪些?

    新手往往会被 Linux 众多的发行版本搞得一头雾水,我们首先来解释一下这个问题. 从技术上来说,李纳斯•托瓦兹开发的 Linux 只是一个内核.内核指的是一个提供设备驱动.文件系统.进程管理.网络通 ...

  10. 基本命令学习 -(3)Linux压缩和解压缩命令汇总

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 前言 Linux下的压缩和解压缩工具比较多,有时经常记不住,这里给大家汇总一下,方便大家查阅. ...