springboot核心原理:
  1.基于springmvc无配置文件完全注解化 + 内置web容器实现springboot框架。main函数方式的启动
  2.通过maven快速整合第三方框架
springboot两个核心
  内置的Tomcat(ServletWebServerFactoryAutoConfiguration)
  dispatcherServlet(DispathcerServletAutoConfiguration)
springboot启动流程
  1.创建SpringApplication对象
  2.调用SpringApplication.run()方法启动项目,同时返回当前容器的上下文
流程:
  1.判断当前应用的启动类型(webApplicationType):servlet?reactive?none?
  2.加载spring.factories中所有的ApplicationContextInitializer的实现类,存到集合中
  3.加载spring.factories中所有的ApplicationListener的实现类,存到集合中
  4.推断当前项目的启动main函数:在方法中抛出一个运行时异常,获取异常栈信息中main方法对应的className
启动:
  1.记录当前项目的启动耗时
  2.加载spring.factories文件中SpringApplicationRunListener的实现类EventPublishingRunListener(在后面,spring会通过多事件派发器来通知所有的事件监听器)
  3.发布starting事件
  4.发布prepareEnvironment事件:在这里,会获取到spring的配置文件,并按照优先级进行覆盖;该方法主要是完成了将application.properties配置文件配置的内容赋值到spring容器中的作用(优先级的覆盖),最后,会调用MutablePropertySources.addLast()方法
  5.根据webApplicationType来创建上下文环境(ConfigurableApplicationContext)
  6.刷新容器:在刷新容器中,会调用子类的onRefresh()方法,早onRefresh()方法中初始化dispatcherServlet、启动Tomcat容器
  8.发布started事件和running事件 
 
  1. public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
  2. this.resourceLoader = resourceLoader;
  3. Assert.notNull(primarySources, "PrimarySources must not be null");
  4. this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
  5. //判断当前应用是什么哪种类型的 none/servlet/reaction
  6. this.webApplicationType = WebApplicationType.deduceFromClasspath();
  7. //从META-INF/spring.factories中读取ApplicationContextInitializer的实现类,放到集合中
  8. setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
  9. //从META-INF/spring.factories中读取ApplicationListener的实现类,放到集合中
  10. setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
  11. //获取到当前应用的启动函数 main方法
  12. this.mainApplicationClass = deduceMainApplicationClass();
  13. }
  1. public ConfigurableApplicationContext run(String... args) {
  2. //获取时间戳,用来计算启动时间
  3. StopWatch stopWatch = new StopWatch();
  4. stopWatch.start();
  5. ConfigurableApplicationContext context = null;
  6. Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
  7. configureHeadlessProperty();
  8. /**
  9. * 获取spring.factories文件中SpringApplicationRunListener的实现类
  10. * 在调用starting的时候,会通过multicastEvent(多事件派发器)发送事件消息,会通知所有的事件监听器,让监听器判断是否对当前发布的事件感兴趣,如果感兴趣,就调用当前监听器的onApplicationEvent()方法
  11. * 那是如何判断当前监听器是否对多事件派发器发送的事件感兴趣呢?
  12. * supportsSourceType
  13. * 和supportsEventType这两个方法
  14. */
  15. SpringApplicationRunListeners listeners = getRunListeners(args);
  16. listeners.starting();
  17. try {
  18. ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
  19. //发布prepareEnviroment事件,在这个事件中,org.springframework.boot.context.config.ConfigFileApplicationListener#onApplicationEvent会完成spring
  20. //boot配置文件优先级的读取和覆盖
  21. ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
  22. configureIgnoreBeanInfo(environment);
  23. Banner printedBanner = printBanner(environment);
  24. //初始化容器上下文,根据webApplicationType类型来判断
  25. context = createApplicationContext();
  26. exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
  27. new Class[] { ConfigurableApplicationContext.class }, context);
  28. prepareContext(context, environment, listeners, applicationArguments, printedBanner);
  29. //刷新spring容器,在这个方法里面完成了Tomcat的初始化和dispatcherServlet的初始化
  30. refreshContext(context);
  31. afterRefresh(context, applicationArguments);
  32. stopWatch.stop();
  33. if (this.logStartupInfo) {
  34. new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
  35. }
  36. listeners.started(context);
  37. callRunners(context, applicationArguments);
  38. }
  39. catch (Throwable ex) {
  40. handleRunFailure(context, ex, exceptionReporters, listeners);
  41. throw new IllegalStateException(ex);
  42. }
  43.  
  44. try {
  45. listeners.running(context);
  46. }
  47. catch (Throwable ex) {
  48. handleRunFailure(context, ex, exceptionReporters, null);
  49. throw new IllegalStateException(ex);
  50. }
  51. return context;
  52. }

这个是springboot启动流程的源码,其中有两个点是比较重要的:

1.prepareEnviroment事件的发布(springboot配置文件的解析)

2.刷新spring容器,完成Tomcat的初始化和dispatcherServlet的初始化

springboot启动原理解析的更多相关文章

  1. SpringBoot启动原理及相关流程

    一.springboot启动原理及相关流程概览 springboot是基于spring的新型的轻量级框架,最厉害的地方当属自动配置.那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置 二 ...

  2. Spring Boot干货系列:(三)启动原理解析

    Spring Boot干货系列:(三)启动原理解析 2017-03-13 嘟嘟MD 嘟爷java超神学堂 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说 ...

  3. Spring Boot启动原理解析

    Spring Boot启动原理解析http://www.cnblogs.com/moonandstar08/p/6550758.html 前言 前面几章我们见识了SpringBoot为我们做的自动配置 ...

  4. SpringBoot启动原理

    SpringBoot启动原理 我们开发任何一个Spring Boot项目,都会用到如下的启动类: @SpringBootApplication public class Application { p ...

  5. 5、Spring Boot 2.x 启动原理解析

    1.5 Spring Boot 启动原理解析 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏 ...

  6. springboot之启动原理解析

    前言 SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开SpringBoot的神秘面 ...

  7. springboot之启动原理解析及源码阅读

    前言 SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开SpringBoot的神秘面 ...

  8. SpringBoot 2.1.6 启动原理解析(一)

    小白第一次写博客,如果有不足之处烦请各位大佬指正. 用了好久的SpringBoot了,一直不清楚它内部的一些启动原理,如何加载yml文件.如何初始化bean的,今天就记录一下,新建了一个springb ...

  9. SpringBoot启动流程解析

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

随机推荐

  1. python--debug神器pysnooper

    使用它你可以获得什么优势: (1)无需用print就可以获得变量的值: (2)以日志地形式进行保存,方便随时查看: (3)可以根据需要,设置调用函数的深度: (4)多个函数的日志,可以设置前缀进行标识 ...

  2. 【Luogu 1993】差分约束系统问题——小K的农场

    Luogu P1993 前置知识:最短路径相关算法 如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统. 显然题目中给出 ...

  3. python分支循环

    1.遍历循环 for i in range(5) for i in range (M,N,K) for c in s: for c in 'python' print(c,end="&quo ...

  4. nginx-(三)基本模块1

    nginx常用模块介绍 ngx_http_access_module模块的配置(基于IP的访问控制) allow address | CIDR | unix: | all; deny address ...

  5. python的reduce,map,zip,filter和sorted函数

    一.    reduce(function,Iterable),它的形式和map()函数一样.不过参数function必须有两个参数. reduce()函数作用是:把结果继续和序列的下一个元素做累积计 ...

  6. 在linux和windows中使用selenium

     在linux和windows中使用selenium 一. selenium(浏览的人你们多大呀?是AI?) selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法 ...

  7. 攻略前端面试官(一):JS的数据类型和内存机制浅析

    原文地址:http://rainykane.cn/2019/09/29/与K_K君一起攻略前端面试官(一):JS的数据类型和内存机制浅析/ 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看 ...

  8. vue下谷歌浏览器的扩展程序(vue-devtools-master)

    1,在百度网盘中下载压缩包,网盘地址:https://pan.baidu.com/s/1BnwWHANHNyJzG3Krpy7S8A ,密码:xm6s 2,将压缩包解压到F盘,F:\chromeVue ...

  9. 【Android - 自定义View】之自定义颜色渐变的Tab导航栏

    首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 GradientTab ,继承自View类: (2)这个自定义View实现了颜色渐变的Tab导航栏(仿微信主菜单),用户在左右滑 ...

  10. Java多线程——锁

    Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...