【springboot】启动原理

embedded/2024/11/18 12:02:55/

目录

          • 1. 说明
          • 2. 启动类与注解
          • 3. SpringApplication的构建与服务类型确定
          • 4. 启动流程
          • 5. 自动配置与Bean实例化
          • 6. 启动内嵌服务器

1. 说明
  • 1.Spring Boot的启动原理是一个复杂而又精妙的流程,它涉及多个组件和步骤的协同工作。
2. 启动类与注解
  • 1.Spring Boot应用通常由一个带有@SpringBootApplication注解的主启动类启动。@SpringBootApplication是一个复合注解,它主要由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注解构成
  • 2.@SpringBootConfiguration:标记当前类为Spring配置类,等同于@Configuration注解。
  • 3.@EnableAutoConfiguration:负责自动配置Spring应用上下文,加载符合条件的@Configuration配置类。这个注解通过@Import引入了AutoConfigurationImportSelector,该类负责从META-INF/spring.factories文件中加载自动配置类。
  • 4.@ComponentScan:自动扫描并加载符合条件的Spring Bean,这些特定的注解大致包括@Controller、@Entity、@Component、@Service、@Repository等。
3. SpringApplication的构建与服务类型确定
  • 1.SpringApplication.run()是Spring Boot应用启动的入口。
  • 2.资源加载器与主方法类的记录:记录资源加载器和主方法类。
  • 3.确定Web服务的类型:可能是SERVLET、REACTIVE或NONE。WebApplicationType.deduceFromClasspath()方法会根据类路径中存在的类来推断当前应用的Web环境类型。
  • 4.加载配置:加载META-INF/spring.factories文件中的BootstrapRegistryInitializer、ApplicationContextInitializer和ApplicationListener配置。
4. 启动流程
  • 1.初始化配置:通过类加载器读取classpath下所有的spring.factories配置文件,创建一些初始配置对象;通知监听者应用程序启动开始,创建环境对象environment,用于读取环境配置,如application.yml或application.properties。
  • 2.创建应用程序上下文:创建ApplicationContext和BeanFactory对象。
  • 3.刷新上下文(启动核心):
    a.配置工厂对象,包括上下文类加载器、对象发布处理器、BeanFactoryPostProcessor。
    b.注册并实例化BeanFactoryPostProcessor,并且调用这些处理器,对包进行扫描解析(主要是class文件)。
    c.注册并实例化BeanPostProcessor。
    d.初始化一些与上下文有特别关系的Bean对象(如创建Tomcat服务器)。
    e.实例化所有BeanFactory缓存的Bean对象(剩下的)。
    f.发布通知,通知上下文刷新完成(启动Tomcat服务器)。
  • 4.通知监听者:启动程序完成。在启动过程中,大部分对象都是通过BeanFactory对象通过反射创建的。
5. 自动配置与Bean实例化
  • 1.Spring Boot的自动配置机制会根据项目中添加的jar依赖,尝试猜测并配置可能需要的Bean。
  • 2.自动配置类会根据条件进行加载和执行,以确保配置的正确性和合理性。
  • 3.所有配置类和组件被加载后,Spring容器会根据需要创建和配置Bean实例。
  • 4.这些Bean可能是由Spring Boot提供的自动配置,也可能是开发者自定义的Bean。
6. 启动内嵌服务器
  • 1.Spring Boot内置了Tomcat、Jetty等Web服务器。
  • 2.当Spring Boot应用程序启动时,它会根据配置文件中的信息自动创建Tomcat或Jetty等Web容器,并将Spring容器注册到Web容器中,使得Spring Boot应用程序可以直接以Web应用程序的形式运行。

http://www.ppmy.cn/embedded/138529.html

相关文章

【更新中】《硬件架构的艺术》笔记(三):处理多个时钟

介绍 单时钟设计更易于实现,也更少出现亚稳态、建立和保持时间违例方面的问题。但在实践中,很少有设计只在一个时钟下运行。 多时钟域 多个始终可以有以下一种或多种时钟关系: 1、时钟频率不同。 2、时钟频率相同,但相位不同…

【GNU】gcc -O编译选项 -Og -O0 -O1 -O2 -O3 -Os

1、gcc -O的作用 GCC 提供的 -O 系列选项用于优化代码。这些选项可以控制编译器对代码进行优化的程度和类型,从而提高代码的性能、减小代码体积或优化其他特性。 2、gcc -Og -O0 -O1 -O2 -O3 -Os 2.1 gcc -Og 启用调试友好的优化,平衡调试器功能与性…

JAVA-链表

1.链表的概念及结构 链表是一种物理存储结构上非连续存储结构(逻辑上连续),数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 注意: 根据上图可看出,链表是在逻辑结构连续的,但是在物理结构上不一定现实中的结点一般都是通…

嵌入式开发人员如何选择合适的开源前端框架进行Web开发

在嵌入式系统的Web开发中,前端框架的选择对于项目的成败有着决定性的影响。一个合适的框架不仅能提高开发效率,还能保证系统的稳定性和可扩展性。本文将介绍几款适用于嵌入式Web开发的开源前端框架,并探讨它们的优缺点。 1. Element Plus V…

C++:boost库安装

官网:https://www.boost.org/ Boost 库在 C 社区中广受欢迎,主要因为它提供了丰富、强大且稳定的功能,可以显著提高开发效率和代码质量。下面是使用 Boost 库的主要优势和特点: 1. 丰富的功能集合 Boost 提供了数十个高质量的 …

macOS解决U盘装完系统容量变小的问题

发现原来256GB容量的U盘在mac电脑上只显示34GB,想起来之前用该U盘装过系统,最终搜到了以下解决方案,在此记录: (1) 查看盘符列表,找到需要格式化的U盘,假设为disk4 diskutil list(2) 卸载分区disk4 disk…

计算机编程中的测试驱动开发(TDD)及其在提高代码质量中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 计算机编程中的测试驱动开发(TDD)及其在提高代码质量中的应用 计算机编程中的测试驱动开发(T…

【C++】类和对象-深度剖析默认成员函数-上

> 🍃 本系列为初阶C的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:[小编的个人主页])小编的个人主页 > 🎀 🎉欢迎大家点赞👍收藏⭐文章 > ✌️ 🤞 &#x1…