Spring Boot 的启动原理、Spring Boot 自动配置原理

embedded/2024/9/23 20:21:22/

Spring Boot启动原理包含自动装配原理。

Spring Boot 的启动原理:

1. 入口类与 SpringApplication 初始化:
应用程序通常从一个带有 @SpringBootApplication 注解的主类开始,这个注解是一个组合注解,包含了 @SpringBootConfiguration, @EnableAutoConfiguration, 和 @ComponentScan
主类中通过调用 SpringApplication.run(YourMainClass.class, args) 方法启动应用。
SpringApplication 初始化时,会加载外部配置(如application.properties或YAML)、初始化环境变量、加载自定义配置类等。

2. 加载自动配置:
@EnableAutoConfiguration 通过 SpringFactoriesLoader 加载所有 META-INF/spring.factories 中配置的 AutoConfigurationImportSelector 类。
AutoConfigurationImportSelector 会根据类路径上的jar和激活的profile来决定哪些自动配置类需要被加载。

3. 初始化 ApplicationContext:
SpringApplication 会创建并配置 ApplicationContext(通常是 AnnotationConfigApplicationContext),这个上下文是Spring容器的核心,负责管理Bean的生命周期。
期间会执行所有的 ApplicationListener 监听器的 onApplicationEvent 方法,以及所有注册的 SpringApplicationRunListener 的回调方法,如 starting()、environmentPrepared()、contextLoaded() 等。

4. Bean 定义与注册:
通过 @ComponentScan 扫描并注册应用中定义的组件(如 @Service, @Repository, @Controller 等)。
加载并处理 @Configuration 类中的 @Bean 方法,注册Bean定义。
自动配置类中定义的Bean也会在此阶段被注册到容器中。

5. Bean 实例化与依赖注入:
完成Bean定义的注册后,Spring容器会实例化这些Bean,并处理依赖注入,构建Bean之间的依赖关系。

6. 初始化完毕与启动完成:
应用上下文初始化完成后,会调用所有 CommandLineRunner 接口的实现类的 run 方法,以及 ApplicationRunner 的 run 方法,这是执行应用启动后任务的好时机。

最终,SpringApplication 的 run 方法完成,应用启动成功,等待处理HTTP请求或其他任务。
整个过程高度自动化,简化了传统Spring应用的配置工作,让开发者能更专注于业务逻辑的实现。

Spring Boot 自动配置原理

Spring Boot 的自动配置原理基于以下核心机制和组件:

1. 类路径扫描:Spring Boot 在应用启动时,会自动扫描应用类路径下的 jar 包,寻找包含 spring.factories 文件的 Spring Boot Starter 组件。这个文件列出了自动配置类以及其他初始化组件。

2. 自动配置类:这些自动配置类使用 @Configuration 注解标记,并通过条件注解如 @ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty 等来决定是否生效。这些条件注解基于类是否存在、特定的Bean是否已经定义、特定的属性值等条件来控制配置的启用。

3. 条件装配:根据应用上下文中的类和Bean的存在情况,以及配置属性的值,自动配置类中的配置逻辑会动态调整。如果检测到某个条件满足(例如,存在特定的类或设置了特定的属性),则相应的配置代码会被执行,从而向 Spring 容器注册Bean定义。

4. 用户自定义优先:自动配置遵循“用户配置优先”的原则。如果用户在自己的配置中显式定义了某个Bean(使用 @Bean 或 @Component 等),那么相同类型的自动配置Bean将不会被注册,确保了用户自定义配置的最高优先级。

5. 属性绑定:Spring Boot 支持自动绑定外部配置(如 application.properties 或 YAML 文件中的配置)到配置类的字段上,通过 @Value、@ConfigurationProperties 等注解实现,使得配置更加灵活和可外部化。

6. Starter POMs:Spring Boot 提供了一系列的 "Starter" 依赖,这些依赖本质上是一组 Maven POMs,它们导入了相关的库和自动配置模块,简化了项目的依赖管理。例如,加入 spring-boot-starter-web 会自动配置Tomcat、Spring MVC等组件。

综上所述,Spring Boot 的自动配置机制通过智能化的类路径扫描、条件化配置以及属性绑定等技术,大大简化了应用的配置过程,使得开发者能够快速启动和运行应用,同时保持高度的可定制性。


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

相关文章

Github 2024-06-10开源项目周报 Top15

根据Github Trendings的统计,本周(2024-06-10统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目8Jupyter Notebook项目2Go项目2C++项目1Shell项目1Lua项目1JavaScript项目1MDX项目1C项目1HTML项目1Python - 100天从新手到大师 创建…

桂电人工智能学院大数据实验,使用 Docker 搭建 hadoop 集群

桂电人工智能学院大数据实验,使用 Docker 搭建 hadoop 集群 第一步 安装 Docker, Windows 上可以使用 Docker Desktop 下载地址:https://www.docker.com/products/docker-desktop/ 安装过程自行谷歌 安装好的标志:打开终端 运行docker p…

高等数学与初等数学的分水岭是什么?

高等数学与初等数学的分水岭是什么? 高等数学与初等数学的一个重要分水岭可以认为是极限的概念。 在初等数学中,主要涉及常量的运算和一些简单的函数关系等。而当引入极限概念后,数学的研究范围和方法发生了很大变化。高等数学围绕极限展开了…

安全测试框架 二

使用安全测试框架进行测试,可以遵循以下步骤进行,以确保测试的全面性和系统性: 一、明确测试目标和需求 确定测试的范围和重点,明确要测试的系统或应用的安全性方面的关键点和重要性。根据业务需求和安全标准,制定详…

【three.js】旋转、缩放、平移几何体

目录 一、缩放 二、平移 三、旋转 四、居中 附源码 BufferGeometry通过.scale()、.translate()、.rotateX()、.rotateY()等方法可以对几何体本身进行缩放、平移、旋转,这些方法本质上都是改变几何体的顶点数据。 我们先创建一个平面物体,样子是这样的。 一、缩放 // 几何…

探索档案未来,尽在ARCHE-2024

2024年第三届上海国际智慧档案展览会暨高峰论坛(ARCHE-2024)将于2024年6月19日至21日在上海跨国采购会展中心隆重举行。深圳市铨顺宏科技有限公司应邀参展,将以全新形象盛装亮相,展示其在档案管理领域的最新技术和解决方案。 ARC…

深入分析 Android BroadcastReceiver (三)

文章目录 深入分析 Android BroadcastReceiver (三)1. 广播消息的优缺点及使用场景1.1 优点1.2 缺点 2. 广播的使用场景及代码示例2.1. 系统广播示例:监听网络状态变化 2.2. 自定义广播示例:发送自定义广播 2.3. 有序广播示例:有序广播 2.4. …

521. 最长特殊序列 Ⅰ(Rust单百解法-脑筋急转弯)

题目 给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列 的长度。如果不存在,则返回 -1 。 「最长特殊序列」 定义如下:该序列为 某字符串独有的最长 子序列 (即不能是其他字符串的子序列) 。 字符串 s …