当前位置: 首页 > news >正文

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

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

相关文章:

  • C++面向对象程序设计 - 命名空间
  • stm32编写Modbus步骤
  • Idea jdk配置的地方 启动时指定切换的地方
  • 嵌入式学习
  • 学习分享-分布式 NoSQL 数据库管理系统Cassandra以及它和redis的区别
  • 2024 Java 异常—面试常见问题
  • 华为坤灵路由器初始化开局的注意事项,含NAT配置
  • 使用C#快速搭建一个在windows运行的exe应用
  • python format详解
  • CI/CD实战面试宝典:从构建到高可用性的全面解析
  • UE5.2打包安卓
  • k8s可练习实验分享
  • 1毛钱1百万token,写2遍红楼梦!国产大模型下一步还想卷什么?
  • 【数据库设计】宠物商店管理系统
  • Python第二语言(十四、高阶基础)
  • 深入了解以太坊
  • 08.Android之View事件问题
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • ES6简单总结(搭配简单的讲解和小案例)
  • Javascript基础之Array数组API
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • orm2 中文文档 3.1 模型属性
  • yii2中session跨域名的问题
  • 缓存与缓冲
  • 检测对象或数组
  • 简单实现一个textarea自适应高度
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 山寨一个 Promise
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 项目管理碎碎念系列之一:干系人管理
  • 一道面试题引发的“血案”
  • 原生JS动态加载JS、CSS文件及代码脚本
  • ​如何防止网络攻击?
  • ​油烟净化器电源安全,保障健康餐饮生活
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二)springcloud实战之config配置中心
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (三)elasticsearch 源码之启动流程分析
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (四)c52学习之旅-流水LED灯
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)甲方乙方——赵民谈找工作
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET 解决重复提交问题
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .NET开发人员必知的八个网站
  • .Net下的签名与混淆
  • .NET项目中存在多个web.config文件时的加载顺序
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /usr/bin/env: node: No such file or directory
  • @RequestBody详解:用于获取请求体中的Json格式参数