李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 每日心情
  • Now
  • 系列文章
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 博友圈
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于我
    • 网站地图
    • 网站统计
    • 另一个网站
    • 我的导航站
    • 赞助
  • 🚇开往
Destiny
自是人生长恨水长东
  1. 首页
  2. 原创
  3. 正文

SpringBoot启动概述(SpringBoot2.1.7)

2020年1月10日 约 951 字4 分钟 40 0 0
本文最后更新于 2020年1月10日,距今已 2415 天,其中的信息可能已经发生变化,请注意甄别。

SpringBoot启动概述(SpringBoot2.1.7)

  1. 实例化SpringApplication
    1. 推断web应用的类型(webApplicationType)
    2. 初始化ApplicationContextInitializer:通过ClassLoader.getResources加载META-INF/spring.factories路径下的文件信息,从中找key为ApplicationContextInitializer.class的对应类,并实例化
    3. 读取META-INF/spring.factories,并实例化ApplicationListener:通过ClassLoader.getResources加载META-INF/spring.factories路径下的文件信息ApplicationListener.class对应类,并实例化
    4. 推断main方法所在类
  2. 调用SpringApplication.run()方法
    1. 调用getRunListeners()方法从META-INF/spring.factories配置文件中读取所有配置的SpringApplicationRunListener,并构造SpringApplicationRunListeners实例
    2. 调用所有SpringApplicationRunListeners的starting()方法,发布ApplicationStartedEvent事件
    3. 调用prepareEnvironment()方法准备环境信息()
      1. prepareEnvironment()内调用getOrCreateEnvironment()方法得到环境对象ConfigurableEnvironment,没有则创建一个StandardServletEnvironment
      2. 调用configureEnvironment()方法配置激活环境信息,通过从系统环境变量里取或启动时通过SpringApplication.setAdditionalProfiles("")添加进来的
      3. 调用所有SpringApplicationRunListeners的environmentPrepared()方法,发布ApplicationEnvironmentPreparedEvent事件,加载Spring配置文件信息,例如application.properties等
    4. 打印Banner(SpringBoot)
    5. 调用createApplicationContext()方法根据webApplicationType创建ApplicationContext对象
      1. 由于是SERVLET所以创建的是AnnotationConfigServletWebServerApplicationContext()对象
      2. AnnotationConfigServletWebServerApplicationContext()对象会创建AnnotatedBeanDefinitionReader对象检测是否需要将以下对象放到Spring上下文中:
        // 用户配置Configuration注解,实现了BeanDefinitionRegistryPostProcessor接口,
        // 在容器刷新时,处理后置工厂处理器用来扫描Spring,注册Bean
        ConfigurationClassPostProcessor
        // 用于配置Autowired注解,实现了MergedBeanDefinitionPostProcessor接口
        AutowiredAnnotationBeanPostProcessor
        // 用于配置Required注解,实现了MergedBeanDefinitionPostProcessor接口
        RequiredAnnotationBeanPostProcessor
        // 用于配置JSR-250注解,实现了InstantiationAwareBeanPostProcessor接口
        CommonAnnotationBeanPostProcessor
        // 用于配置JPA注解
        PersistenceAnnotationBeanPostProcessor
        // 用于配置EventListener注解,实现了SmartInitializingSingleton接口
        EventListenerMethodProcessor
        // EventListener工厂
        DefaultEventListenerFactory
    6. 调用prepareContext()方法准备应用上下文
      1. context.setEnvironment(environment)对ApplicationContext设置环境变量
      2. postProcessApplicationContext(context)配置属性ResourceLoader和ClassLoader属性
      3. applyInitializers(context)调用步骤1.2查询出来ApplicationContextInitializer子类,循环调用initialize()方法。
      4. 然后调用所有SpringApplicationRunListeners的contextPrepared()方法,发布ApplicationContextInitializedEvent事件
    7. 调用refreshContext()方法,刷新上下文
      • 底层调用AbstractApplicationContext的refresh()方法刷新上下文
        1. 调用prepareRefresh()方法准备刷新的上下文
        2. 调用obtainFreshBeanFactory()方法初始化BeanFactory
        3. prepareBeanFactory(beanFactory)对beanFactory进行各种功能填充
        4. 调用postProcessBeanFactory(beanFactory)方法添加后置处理器,创建Tomcat时会利用这个后置处理器来初始化Tomcat Server类
        5. 调用invokeBeanFactoryPostProcessors(beanFactory),激活各种Beanfactory处理器:主要是利用AnnotatedBeanDefinitionReader对象注入的ConfigurationClassPostProcessor来处理组件的注入
        6. registerBeanPostProcessors(beanFactory)注册拦截Bean创建的Bean处理,这里只是注册,真正调用是再拿去Bean的时候
        7. initMessageSource()为上下文初始化Message源,即不同语言的消息体,国际化处理,如果容器中没有则创建一个DelegatingMessageSource国际化,并将它注册到Spring容器中
        8. initApplicationEventMulticaster()初始化应用消息广播器,并放到applicationEventMulticasterbean中,如果容器中没有则创建一个SimpleApplicationEventMulticaster事件派发器,并将它注册到Spring容器中
        9. onRefresh()留给子类来初始化其他bean,主要目的是初始化Tomcat等内置服务器(ServletWebServerApplicationContext实现了AbstractApplicationContext的onRefresh(),方法底层调用了此类的createWebServer()方法来创建WebServer容器)
        10. registerListeners()在所有注册的bean中查找Listener bean,注册到消息广播中
        11. finishBeanFactoryInitialization(beanFactory)初始化剩下的单实例(非惰性)
        12. finishRefresh()完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人
    8. 调用afterRefresh()方法
    9. 调用所有SpringApplicationRunListeners的started()方法
    10. 调用callRunners()方法(该方法会从IOC容器里找到ApplicationRunner或者CommandLineRunner并执行其run方法,当我们需要在SpringBoot程序启动时处理我们自己的逻辑,那么就可以实现上述接口)
    11. 调用所有SpringApplicationRunListeners的running()方法

推荐阅读

  • SpringBoot常用注解
  • SpringBoot 中内置的 49 个常用工具类
  • SpringBoot基于redis的分布式锁的实现(源码)
  • Spring中@NotNull、@NotBlank、@NotEmpty的区别
  • CompletableFuture使用详解
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/article/1647

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: JAVA Spring SpringBoot
最后更新:2020年1月10日

岁月同一天 8 月 21 日

回望过去的今天,你在写什么

  • 7 年前 2019年8月21日
    如何让代码看起来更优雅?

    相信很多人都会有这样的疑问吧,看各种框架的代码看着感(根)觉(本)特(看)别(不)溜(懂),而自己写出来的代码怎么看怎么…

相关文章
  • 从零开始入门 K8s | Kubernetes 网络概念及策略控制2019年10月17日
  • 动态线程池框架DynamicTp使用以及架构设计2025年4月29日
  • 8条经验轻松上手IDEA插件开发2020年11月6日
  • SpringBoot使用注解的方式构建Elasticsearch查询语句,实现多条件的复杂查询2019年9月12日
  • Java设计模式:策略模式2025年5月22日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复

文章评论

还没有评论,快来抢沙发吧~

秋风清,秋月明,落叶聚还散,寒鸦栖复惊。相思相见知何日?此时此夜难为情!
入我相思门,知我相思苦,长相思兮长相忆,短相思兮无穷极, 早知如此绊人心,何如当初莫相识。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
每日早报 · 2026年8月20日 · 早上好 Kratos+ v1.1.18版本更新说明 每日早报 · 2026年8月19日 每日早报 · 2026年8月18日 写了一个订阅每日新闻的WP插件 每日早报 · 2026年8月17日
给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能Kratos+ v1.1.16版本更新说明AI时代,个人技术博客的出路在哪里?增加了两套复古皮肤-牛皮纸、千禧网页这个域名注册整整十年了,十年时间,真快啊Kratos+ v1.1.14版本更新说明
WordPress评论框增加自定义表情 一篇文章帮你彻底搞清楚“I/O多路复用”和“异步I/O”的前世今生 开发者必懂的 AI 向量入门:从数学基础到实战应用 Claude Haiku 4.5、Claude Sonnet 4.6、Claude Opus 4.7 区别以及各自的新特性 mybatis-plus-join-boot-starter介绍及用法 感觉Typecho很简洁啊……
最近评论
李锋镝 发布于 1 天前(08月20日) 皮总谦虚了呀
皮皮社长 发布于 2 天前(08月19日) 李哥越来越凶了,主题也越来越好看。不刺眼。不像我那垃圾主题。羡慕吖~
李锋镝 发布于 2 天前(08月19日) 这个法子好
林羽凡 发布于 3 天前(08月18日) 其实可以把各个大平台的热榜按分类抓取过来,有啥热点消息也就知道了。
李锋镝 发布于 3 天前(08月18日) 给主题加了个功能,可以在RSS中排除指定分类,哈哈哈
标签聚合
多线程 AI编程 WordPress 日常 IDEA SQL MySQL 数据库 Claude AI Spring 分布式 ElasticSearch Redis MQ 架构 JAVA SpringBoot JVM K8s
友情链接
  • Honesty
  • 知向前端
  • 韩小韩博客
  • 老张博客
  • 林羽凡
  • Serendipity
  • 哥斯拉
  • Mr.Sun的博客
  • 彬红茶日记
  • 若梦博客
  • 韩情脉脉
  • 志文工作室
  • 皮皮社
  • 懋和道人
  • 临窗旋墨
  • 九仞之行
  • 搬砖日记
  • sssr7844的博客
  • 瓦匠个人小站
  • 蜗牛工作室

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

正在博友圈履约中

域名年龄

Theme Kratos+ By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号