springboot源码从main函数开始

  1. public static void main(String[] args) {
  2. ApplicationContext app = SpringApplication.run(BeikbankApplication.class, args);
  3. }

进入run方法,再持续进入到实际操作的步骤

  1. public static ConfigurableApplicationContext run(Object source, String... args) {
  2. return run(new Object[] { source }, args);
  3. }
  1. public static ConfigurableApplicationContext run(Object[] sources, String[] args) {
  2. return new SpringApplication(sources).run(args);
  3. }
  1. public ConfigurableApplicationContext run(String... args) {
  2. //秒表计时器,用来记录整个容器启动时间
  3. StopWatch stopWatch = new StopWatch();
  4. stopWatch.start();
  5. ConfigurableApplicationContext context = null;
  6. FailureAnalyzers analyzers = null;
  7. //配置headless系统属性
  8. configureHeadlessProperty();
  9. //获取springbootApplication注解的类信息开启监听
  10. SpringApplicationRunListeners listeners = getRunListeners(args);
  11. listeners.starting();
  12. try {
  13. //应用参数初始化
  14. ApplicationArguments applicationArguments = new DefaultApplicationArguments(
  15. args);
  16. //环境变量初始化
  17. ConfigurableEnvironment environment = prepareEnvironment(listeners,
  18. applicationArguments);
  19. //打印banner,就是spring图形
  20. Banner printedBanner = printBanner(environment);
  21. //创建应用上下文,默认会得到AnnotationConfigEmbeddedWebApplicationContext
  22. context = createApplicationContext();
  23. //反射加载实例化FailureAnalyzer实现类
  24. analyzers = new FailureAnalyzers(context);
  25. //上下文环境准备
  26. prepareContext(context, environment, listeners, applicationArguments,
  27. printedBanner);
  28. //主要的IOC过程,也是springMVC的主要过程,进行bean的相关接口初始化和bean实例化
  29. refreshContext(context);
  30. //到上一步tomcat已经启动完成了,这里算是springboot的扩展接口,可以自己实现ApplicationRunner或CommandLineRunner接口,在这里进行实例化开始运行
  31. afterRefresh(context, applicationArguments);
  32. //发布事件监听器
  33. listeners.finished(context, null);
  34. //停止计时
  35. stopWatch.stop();
  36. if (this.logStartupInfo) {
  37. new StartupInfoLogger(this.mainApplicationClass)
  38. .logStarted(getApplicationLog(), stopWatch);
  39. }
  40. return context;
  41. }
  42. catch (Throwable ex) {
  43. handleRunFailure(context, listeners, analyzers, ex);
  44. throw new IllegalStateException(ex);
  45. }
  46. }

我把主要步骤的每一步都标明了注释,看起来这里很多都是springboot特有,但主要的实现还是对springMVC的继承,你去看springmvc的源码,会发现,它主要的过程就是refreshContext这个方法所展现的过程

springboot源码解读的更多相关文章

  1. SpringBoot源码解读系列三——引导注解

    我们再来看下SpringBoot应用的启动类: 查看代码 import org.springframework.boot.SpringApplication; import org.springfra ...

  2. springboot源码解读01

    package org.springframework.web; @javax.servlet.annotation.HandlesTypes({org.springframework.web.Web ...

  3. SpringBoot源码解读系列——开篇

    什么是SpringBoot? 定义可以参考官网:SpringBoot官网,其定义通俗易懂,这里就不赘述. 官网也给出了一个通用的SpringBoot工程样例,其中包含了这么几个元素: 1.pom依赖 ...

  4. Mybatis源码解读-SpringBoot中配置加载和Mapper的生成

    本文mybatis-spring-boot探讨在springboot工程中mybatis相关对象的注册与加载. 建议先了解mybatis在spring中的使用和springboot自动装载机制,再看此 ...

  5. KClient——kafka消息中间件源码解读

    目录 kclient消息中间件 kclient-processor top.ninwoo.kclient.app.KClientApplication top.ninwoo.kclient.app.K ...

  6. 助力SpringBoot自动配置的条件注解ConditionalOnXXX分析--SpringBoot源码(三)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 如何分析SpringBoot源码模块及结构?--SpringBoot源码(二) 上一篇分析了SpringBoo ...

  7. 如何分析SpringBoot源码模块及结构?--SpringBoot源码(二)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 如何搭建自己的SpringBoot源码调试环境?--SpringBoot源码(一). 前面搭建好了自己本地的S ...

  8. SpringApplication对象是如何构建的? SpringBoot源码(八)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 本篇接 SpringBoot的启动流程是怎样的?SpringBoot源码(七) 1 温故而知新 温故而知新,我们来简单回顾一下上 ...

  9. springboot源码解析-管中窥豹系列之项目类型(二)

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...

随机推荐

  1. 合并数组,改变原数组apply与不改变原数组

    一看见合并数组,可能第一反应就是concat,concat确实具有我们想要的行为,但它实际上并不附加到现有数组,而是创建并返回一个新数组. 同样你也许会想到ES6的扩展运算符...         但 ...

  2. 深入浅出PF 学习笔记---TypeConverter

    StringToHumanTypeConverter类(从TypeConverter继承 using System; using System.Collections.Generic; using S ...

  3. openvpn显示连接成功但是无法进行git操作

    使用openvpn连接公司内网以进行git操作.以管理员身份运行openvpn gui,一段时间后提示连接成功,右下角图标变成绿色,但是进行git操作,每次都发生失败,提示连接不上.右键点击openv ...

  4. 从 ELK 到 EFK 的演进

    背景 作为中国最大的在线教育站点,目前沪江日志服务的用户包含网校,交易,金融,CCTalk 等多个部门的多个产品的日志搜索分析业务,每日产生的各类日志有好十几种,每天处理约10亿条(1TB)日志,热数 ...

  5. js正则积累

    判断是否为数字 function isNumber(val){ var regPos = /^\d+(\.\d+)?$/; //非负浮点数 var regNeg = /^(-(([0-9]+\.[0- ...

  6. Python+Selenium学习--cookie处理

    场景 有时候我们需要验证浏览器中是否存在某个cookie,因为基于真实的cookie 的测试是无法通过白盒和集成测试完成的.webdriver 可以读取.添加和删除cookie 信息.webdrive ...

  7. protobuf shutdownprotobuflibrary的时候crash,释放的指针出错

    往往是多个子项目中有多次链接使用. 解决方法: 1. 使用静态库. 2. issure中有说2.6.1还未允许多次释放,建议使用3.4.x版本. 参考: https://github.com/prot ...

  8. [leetcode]58. Length of Last Word最后一个词的长度

    Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...

  9. Eclipse常用快捷键(用到想到随时更新)

    原始链接:https://jingyan.baidu.com/article/fedf073771323235ac8977f1.html Shift+Enter在当前行的下一行插入空行(这时鼠标可以在 ...

  10. salt-api配置安装 以及使用

    salt-api salt-api是我们通过restful-api调用salt-master的接口,且调用的时候必须通过认证才能调用,认证的用户为系统用户,下面就说说如何配置salt-api. 安装S ...