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.rhkb.cn/news/10051.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 索引存储结构

索引是优化数据库查询最重要的方式之一&#xff0c;它是在 MySQL 的存储引擎层中实现的&#xff0c;所以 每一种存储引擎对应的索引不一定相同。我们可以通过下面这张表格&#xff0c;看看不同的存储引擎 分别支持哪种索引类型&#xff1a; BTree 索引和 Hash 索引是我们比较…

5.桥模式(Bridge)

动机 由于某些类型的固有的实现逻辑&#xff0c;使得它们具有两个变化的维度&#xff0c;乃至多个纬度的变化。 &#xfeff;class Messager{ public:// 登录virtual void Login(string username, string password)0;// 发送消息virtual void SendMessage(string message)0;/…

【Rust自学】15.1. 使用Box<T>智能指针来指向堆内存上的数据

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 15.1.1. Box<T> box<T>可以被简单地理解为装箱&#xff0c;它是最简单的智能指针&#xff0c;允许你在堆内存上存储数据&am…

【电工基础】低压电器元件,低压断路器(空开QF),接触器(KM)

一.低压电器元件定义 电器可分为高压电器和低压电器两大类&#xff0c;我国现行标准是将工作在交流1200V(50Hz)以下、直流1500V以下的电器设备称为低压电器。 二.低压断路器&#xff0c;空开&#xff0c;空气断路器 1.空开图片与使用方式 当电路中发生严重过载、短路及失压等故…

论文阅读(七):贝叶斯因果表型网络解释遗传变异和生物学知识

1.论文链接&#xff1a;Bayesian Causal Phenotype Network Incorporating Genetic Variation and Biological Knowledge 摘要&#xff1a; 在分离群体中&#xff0c;数量性状基因座&#xff08;QTL&#xff09;定位可以确定对表型有因果效应的QTL。这些方法的一个共同特点是Q…

DeepSeek-R1 模型及GRPO算法学习

总结DeepSeek-R1 模型算法&#xff0c;并对其中的GRPO算法做一些学习补充。 DeepSeek-R1 论文总结 提出了通过强化学习提升大语言模型推理能力的方法&#xff0c;开发出 DeepSeek-R1-Zero 和 DeepSeek-R1 模型&#xff0c;在多个推理任务上表现出色&#xff0c;并开源模型推动…

灰色预测模型

特点&#xff1a; 利用少量、不完全的信息 预测的是指数型的数值 预测的是比较近的数据 灰色生成数列原理&#xff1a; 累加生成&#xff1a; 累减生成&#xff1a;通过累减生成还原成原始数列。 加权相邻生成&#xff1a;&#xff08;会更接近每月中旬&#xff0c;更推荐…

(笔记+作业)书生大模型实战营春节卷王班---L0G2000 Python 基础知识

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/QtJnweAW1iFl8LkoMKGcsUS9nld 课程视频&#xff1a;https://www.bilibili.com/video/BV13U1VYmEUr/ 课程文档&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/Python 关卡作业&#xff1a;htt…

JSR303校验教学

1、什么是JSR303校验 JSR是Java Specification Requests的缩写&#xff0c;意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR&#xff0c;以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。…

springboot使用rabbitmq

使用springboot创建rabbitMQ的链接。 整个项目结构如下&#xff1a; 1.maven依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>3.4.1</version> </dependency>application.y…

WordPress使用(1)

1. 概述 WordPress是一个开源博客框架&#xff0c;配合不同主题&#xff0c;可以有多种展现方式&#xff0c;博客、企业官网、CMS系统等&#xff0c;都可以很好的实现。 官网&#xff1a;博客工具、发布平台和内容管理系统 – WordPress.org China 简体中文&#xff0c;这里可…

hdfs:介绍三个脚本

1、jps-cluster.sh 如果我们想在Bigdata01 这台电脑上&#xff0c;查看整个集群的服务启动情况&#xff0c;可以使用这个脚本文件。 #!/bin/bash USAGE"使⽤⽅法&#xff1a;sh jps-cluster.sh" NODES("bigdata01" "bigdata02" "bigdata03…

智慧园区管理平台实现智能整合提升企业运营模式与管理效率

内容概要 在当今数字化的背景下&#xff0c;智慧园区管理平台正逐渐成为企业提升运营效率和管理模式的重要工具。这个平台汇聚了多种先进技术&#xff0c;旨在通过智能整合各类资源与信息&#xff0c;帮助企业实现全面的管理创新。 智慧园区管理平台不仅仅是一个数据处理工具…

大模型知识蒸馏技术(2)——蒸馏技术发展简史

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl2006年模型压缩研究 知识蒸馏的早期思想可以追溯到2006年,当时Geoffrey Hinton等人在模型压缩领域进行了开创性研究。尽管当时深度学习尚未像今天这样广泛普及,但Hinton的研究已经为知识迁移和模…

python编程环境安装保姆级教程--python-3.7.2pycharm2021.2.3社区版

第1步安装解释器python-3.7.2&#xff0c;第2步安装pycharm编程软件 1、安装解释器 1.1 什么是解释器 就是将Python高级程序语言翻译成为计算机可以识别的0、1代码 1.2 安装解释器python-3.7.2&#xff08;根据自己的操作系统安装适配的解释器&#xff0c;以Windows为例&…

【仓颉】仓颉编程语言Windows安装指南 配置环境变量 最简单解决中文乱码问题和其他解决方案大全

适用于版本&#xff1a; 0.53.13 &#xff5c; 发布日期&#xff1a; 2024-10-24 &#xff08;以后的可能也适用&#xff09; 本机windows版本&#xff1a;24H2 内部版本号windows 10.0.26100 因为仓颉的官方文档一直没更新&#xff0c;所以在这里写一下如何在windows上完成这些…

VS2008 - debug版 - 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。

文章目录 VS2008 - debug版 - 由于应用程序配置不正确&#xff0c;应用程序未能启动。重新安装应用程序可能会纠正这个问题。概述笔记VS2008安装环境VS2008测试程序设置默认报错的情况措施1措施2备注 - exe清单文件的问题是否使用静态库?_BIND_TO_CURRENT_VCLIBS_VERSION的出处…

如何将DeepSeek部署到本地电脑

DeepSeek爆火&#xff0c;如何免费部署到你的电脑上&#xff1f;教程来了&#xff0c;先在你的本地电脑上安装Ollama&#xff0c;然后在Ollama搜索选择DeepSeek模型&#xff0c;即可成功在你的本地电脑上部署DeepSeek 一、安装Ollama 打开Ollama官网&#xff1a;https://ollam…

[Java]泛型(一)泛型类

1. 什么是泛型类&#xff1f; 泛型类是指类中使用了占位符类型&#xff08;类型参数&#xff09;的类。通过使用泛型类&#xff0c;你可以编写可以处理多种数据类型的代码&#xff0c;而无需为每种类型编写单独的类。泛型类使得代码更具通用性和可重用性&#xff0c;同时可以保…

模型I/O功能之模型包装器

文章目录 模型包装器分类LLM模型包装器、聊天模型包装器 截至2023年7月&#xff0c;LangChain支持的大语言模型已经超过了50种&#xff0c;这其中包括了来自OpenAI、Meta、Google等顶尖科技公司的大语言模型&#xff0c;以及各类优秀的开源大语言模型。对于这些大语言模型&…