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

SpringBoot 原理分析

SpringBoot 原理分析

依赖管理相关


启动器 starter

  • Spring BootStarter 是预定义依赖项集合,可简化 Spring 应用配置与构建,启动时自动引入所需库、配置和功能。

  • Spring Boot 有很多预定义 Starter,如

    • spring - boot - starter - web 用于 Web 应用
    • spring - boot - starter - data - jpa 用于数据库访问、
    • spring - boot - starter - security 用于安全认证授权
  • 使用时,在 Maven 的 pom.xml 里添加对应依赖,Spring Boot 会自动管理。

  • 有了 Starter,开发人员无需手动添加大量依赖和编写冗长配置文件,还能保证依赖兼容性和稳定性。

SpringBoot 提供的全部启动器地址

https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters

Starter 命名规范

  • 官方提供的场景:命名为:spring-boot-starter-xxx
  • 第三方提供场景:命名为:xxx-spring-boot-starter

为什么启动器不用写版本

  • 每个 boot 项目都有一个父项目 spring-boot-starter-parent
  • parent 的父项目是spring-boot-dependencies
  • 父项目 版本仲裁中心,把所有常见的 jar 的依赖版本都声明好了。
  • 比如:mysql-connector-j

在这里插入图片描述

如何自定义版本号

  • 方法一

直接在当前项目properties标签中声明父项目用的版本属性的 key

在这里插入图片描述

  • 方法二

直接在导入依赖的时候声明版本

在这里插入图片描述

自动配置相关


@SpringBootApplication 主程序

//1. 配置类 @SpringBootConfiguration — 表示这个类本身是个配置类
//2. 自动加载配置 @EnableAutoConfiguration -  自动加载其他的配置类
//3. @ComponentScan 默认是扫描当前类所在的包和子包 


@SpringBootApplication //这是一个SpringBoot应用
public class MainApplication {

    public static void main(String[] args) {
        //1. 创建 ioc 容器, 加载配置
        //2. 启动内置 的 web 服务器
        SpringApplication.run(MainApplication.class,args);
    }
}

自定义包扫描规则

  • @SpringBootApplication(scanBasePackages = "com.atguigu")
  • @ComponentScan("com.atguigu") 直接指定扫描的路径
  • 注意:都会覆盖 Spring Boot 默认的包扫描规则

基本理解

配置文件基本理解
  • 配置文件的所有配置项是和某个类的对象值进行一一绑定的
  • 绑定了配置文件中每一项值的类: 属性类。
  • 比如:
    • ServerProperties绑定了所有Tomcat服务器有关的配置
    • MultipartProperties绑定了所有文件上传相关的配置
      .

我们使用配置文件可以参照官方文档或者参照帮绑定的属性类

在这里插入图片描述
在这里插入图片描述

按需加载基本理解

导入各种场景比如spring-boot-starter-web 除了会导入相关功能依赖还会导入一个 spring-boot-starter。它是所有starterstarter,基础核心 starter

,
spring-boot-starter 导入了一个包 spring-boot-autoconfigure。包里面都是各种场景的AutoConfiguration自动配置类。

  • 虽然全场景的自动配置都在 spring-boot-autoconfigure这个包,但是不是全都开启的。

  • 导入哪个场景就开启哪个自动配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自动配置完整流程

在这里插入图片描述

一、导入 Starter 包

  • 当我们导入一个 starter-web 包时,实际上是为了进行 Web 开发。这个 Starter 包会为我们导入相关场景所需的一系列依赖,例如 starter-jsonstarter-tomcatspringmvc 等。
  • 每个场景启动器都会引入一个核心的 spring-boot-starter,而这个核心启动器又会引入 spring-boot-autoconfigure 包。
    .

二、核心包 spring-boot-autoconfigure

  • spring-boot-autoconfigure 包中包含了所有场景的配置信息。
  • 然而,Spring Boot 默认情况下只会扫描主程序所在的包及其子包,所以无法直接扫描到 spring-boot-autoconfigure 包下 Spring Boot 官方为我们写好的配置类。
    .

三、主程序中的 @SpringBootApplication 注解

  • 这个注解由 @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan 三个注解组成。
  • 其中,@EnableAutoConfiguration 是 Spring Boot 开启自动配置的核心。它通过 @Import(AutoConfigurationImportSelector.class) 这个注解提供的功能,实现了批量向容器中导入组件的操作。
  • 当项目启动时,会根据 spring-boot-autoconfigure 包下 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中指定的信息,加载 142 个配置类。这些配置类就是 xxxxAutoConfiguration 自动配置类,它们会被 @Import 批量导入机制引入到容器中。
    .

四、自动配置类 xxxxAutoConfiguration

  • 这些自动配置类会使用 @Bean 注解向容器中添加许多组件。
  • 很多自动配置类会使用 @EnableConfigurationProperties(ServerProperties.class) 注解,该注解的作用是将配置文件中以特定前缀配置的属性值封装到相应的 xxxProperties 属性类中。例如在 Tomcat 的情况下,服务器的所有配置通常以 server 开头,这些配置会被封装到对应的属性类中。
  • 容器中所添加组件的核心参数都来自于 xxxProperties,并且这些 xxxProperties 会与配置文件进行绑定。

.

五、按需生效原则

  • 虽然导入了 142 个自动配置类,但并非全部都会生效。
  • 每个自动配置类都带有 @ConditionalOnxxx 条件注解,只有满足相应条件时,该自动配置类才会生效。

.

六、核心流程总结

  • 首先,导入 Starter 包会引入 autoconfigure 包。
  • autoconfigure 包内的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件会指定启动时需要加载的自动配置类。
    -@EnableAutoConfiguration 注解会自动导入文件中所列出的自动配置类,也就是 xxxAutoConfiguration 类,这些类会根据条件注解按需加载。
  • xxxAutoConfiguration 会向容器中导入一堆组件,而这些组件的信息是从 xxxProperties 中提取的。
  • xxxProperties 又与配置文件绑定,这样就可以通过修改配置文件的值来修改核心组件的底层参数。

.

七、最终效果

  • 我们只需要导入相应的 Starter 包,然后修改配置文件,就可以轻松修改 Spring Boot 的底层行为,从而方便快捷地完成各种开发任务,无需手动配置大量的组件和参数,极大地提高了开发效率。

整合 redis 实战

  • 选场景:spring-boot-starter-data-redis

    • 场景 AutoConfiguration 就是这个场景的自动配置类
  • 写配置:

    • 分析到这个场景的自动配置类开启了哪些属性绑定关系

    • @EnableConfigurationProperties(RedisProperties.class)

    • 修改redis相关的配置

  • 分析组件:

    • 分析到 RedisAutoConfiguration 给容器中放了 StringRedisTemplate

    • 给业务代码中自动装配 StringRedisTemplate

  • 定制化

    • 修改配置文件

    • 自定义组件,自己给容器中放一个 StringRedisTemplate 那底层就不会加载 AutoConfiguration 中的 StringRedisTemplate 了因为它有 @ConditionalOnMissBean

第一步: 选场景,导入项目
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
第二步:分析 autoConfiguration,写配置,改配置
  • ctrl + n 搜索类
  • 分析出所有属性绑定在 RedisProperties.class
  • 然后发现所有配置以 spring.data.redis 开头

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第三步:分析 autoConfiguration 中有什么组件可以使用,进行自动装配
  • 分析出 autoConfiguration 有两个 Bean
  • 然后可以用 Autowired 进行自动装配

在这里插入图片描述
在这里插入图片描述

总结

Spring Boot 原理最佳实战

一、场景选择与导入

  • 官方 Starter 包:直接从 Spring Boot 官方提供的 Starter 包中选取所需场景,并导入到项目中。
  • 第三方 Starter 包:在相关仓库中搜索第三方的 Starter 包,以满足特殊需求。

.

二、配置文件操作:

  • 配置文件类位于 XXXAutoConfiguration 中的 @EnableConfigurationProperties(配置文件类)

  • 主要是修改配置文件中的关键项,例如数据库参数,包括连接地址、账号密码等。

.

三、组件分析与使用

  • 分析所选择的场景为项目导入了哪些可用组件。
    • 就是 XXXAutoConfiguration 声明的 @Bean
  • 利用 Spring Boot 的自动装配功能将这些组件装配到容器中,方便后续使用。

.

四、定制化操作

  • 修改配置:通过修改配置文件中的参数,对自动装配的组件进行定制。
  • 自定义组件:若对 Spring Boot 自动配置的默认组件不满意,可以自定义组件,并将其添加到 Spring 容器中,以满足项目的特殊需求。

.

总结:在 Spring Boot 开发中,首先根据需求选择合适的 Starter 包,然后在配置文件中配置关键信息,接着分析并利用自动装配的组件,最后根据项目需要对组件进行定制化,包括修改配置和自定义组件,让开发更加高效便捷。


http://www.kler.cn/a/526148.html

相关文章:

  • 智慧园区管理系统为企业提供高效运作与风险控制的智能化解决方案
  • 园区管理智能化创新引领企业效能提升与风险控制新趋势
  • LabVIEW微位移平台位移控制系统
  • 【hot100】刷题记录(7)-除自身数组以外的乘积
  • 如何构建树状的思维棱镜认知框架
  • 为什么“记住密码”适合持久化?
  • 架构知识整理与思考(其四)
  • 从零搭建一个Vue3 + Typescript的脚手架——day3
  • LeetCode:63. 不同路径 II
  • 在K8s中部署动态nfs存储provisioner
  • 基于 Redis GEO 实现条件分页查询用户附近的场馆列表
  • React第二十八章(css modules)
  • 在彼此的根系里呼吸
  • OpenEuler学习笔记(十七):OpenEuler搭建Redis高可用生产环境
  • V103开发笔记1-20250113
  • 类文件结构
  • Baklib如何提升企业知识管理效率与市场竞争力的五大对比分析
  • FFmpeg rtmp推流直播
  • 道氏理论简介
  • Baklib深入解析企业内容管理与内容中台的本质差异