SpringBoot -- 自动配置机制

使用SpringBoot框架可以让我们快速的构建一个web项目并能成功运行,而之前的SSM则需要我们大量的配置。那么,SpringBoot为什么可以如此神奇,这是怎么做到的呢?那就要介绍一下SpringBoot的自动配置机制。那么,SpringBoot的自动配置机制又是怎么完成相关工作的?

使用SpringBoot快速构建web项目,有几个核心部分,下面就对其进行主要介绍。

1. 场景启动器(starter)

在我们通过SpringBoot构建项目时,必须要在依赖中导入相关的场景启动器,例如web场景对应的spring-boot-starter-web。那么,场景启动器是什么呢?包含哪些内容?

  • 场景启动器会导入相关场景的所有依赖:例如web场景中会导入starter-jsonstarter-tomcatspringmvc

  • 每个场景启动器都会引入spring-boot-starter,也就是核心场景启动器。要注意的是,无论导入的是什么场景,对应的场景启动器都会导入spring-boot-starter。换句话说,它在所有项目中都存在,因此它其中会包含通用的东西。

  • 核心场景启动器引入了spring-boot-autoconfigurespring-boot-autoconfigure里面囊括了所有场景的所有配置类。也就是说,如果这个包下的所有配置类都能生效,那么SpringBoot帮我们整合好的功能就都可以直接使用。

  • 但SpringBoot默认扫描不到 spring-boot-autoconfigure下写好的所有配置类。因为SpringBoot默认只扫描主程序所在的包。

2. 主程序

使用SpringBoot构建项目后,会有一个主程序,也就是程序运行的入口,相当于main函数。其上会有注解@SpringBootApplication标注,那么这个标注又在完成什么事情呢?

  • @SpringBootApplication由三个注解组成@SpringBootConfiguration@EnableAutoConfiguratio@ComponentScan
    • @SpringBootConfiguration注解与@Configuration注解功能相同,声明这是个配置类。
    • @ComponentScan我们也很熟悉,可以指定组件扫描的路径。因此,我们也可以直接通过@SpringBootApplication指定扫描路径。
    • SpringBoot默认只能扫描自己主程序所在的包及其下面的子包。
  • @EnableAutoConfiguration是SpringBoot 开启自动配置的核心:
    • 其源码中包含@Import(AutoConfigurationImportSelector.class),可以批量给容器中导入组件。
    • 因此,SpringBoot项目启动的时候利用 @Import 批量导入组件机制把spring-boot-autoconfigure包下的xxxxAutoConfiguration类导入进来(自动配置类)。
    • 虽然导入了包下所有的配置类,但并不是每一个配置类都能生效。每一个配置类都标注了条件注解@ConditionalOnxxx,只有条件成立,才能生效 。

3. xxxxAutoConfiguration自动配置类

根据前文所述,所有的SpringBoot项目都包含spring-boot-starter,而spring-boot-starter引入了spring-boot-autoconfigurespring-boot-autoconfigure又包含了很多官方已经整合好的配置类,也就是 xxxxAutoConfiguration。那么,配置类是怎么配置的呢?

  • 配置类会使用@Bean 给容器中放相关组件。

  • 许多自动配置类都有注解@EnableConfigurationProperties(ServerProperties.class),用来把配置文件中指定前缀的属性值封装到 xxxProperties属性类中。例如,@EnableConfigurationProperties(ServerProperties.class)会把配置文件中server下所有的配置值都映射到ServerProperties这个类中的属性值。

  • 给容器中放的所有组件的一些核心参数,都来自于xxxProperties。xxxProperties都是通过注解和配置文件绑定的。

  • 因此,我们只需要改配置文件的值,核心组件的底层参数都能修改。

4. 总结

  • 我们导入场景启动器,最终就会引入spring-boot-autoconfigure

  • spring-boot-autoconfigure有一个文件,META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面包含着许多自动配置类,也就是xxxxAutoConfiguration

  • 通过主程序注解中的@EnableAutoConfiguration,把所有的xxxxAutoConfiguration都导入进来

  • 每个xxxxAutoConfiguration会根据自己的条件注解@ConditionalOnxxx进行按需加载,用不到的就不会进行加载

  • xxxxAutoConfiguration会通过注解@EnableConfigurationProperties()xxxProperties与配置文件进行绑定,获取自定义的的配置

  • xxxAutoConfiguration给容器中导入相关组件,组件都是从 xxxProperties中提取属性值

这样,通过SpringBoot的自动配置机制,我们只需要导入starter、修改配置文件,就能修改底层行为,根据我们的需求进行自定义配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776278.shtml

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

相关文章

用系统观念打造智慧公厕,引领智慧城市的发展

智慧公厕,作为智慧城市建设的一部分,具有重要意义。在高度发达的科技条件下,如何打造高质量的智慧公厕是一个值得思考的问题。本文将以智慧公厕源头实力厂家广州中期科技有限公司,大量精品案例项目现场实景实图实例,探…

Java I/O

什么是 IO流? 存储和读取数据的解决方案 I: input O: output 流:像水流一样传输数据 IO流的作用? 用于读写数据(本地文件,网络) IO流从 传输方式 分类 字符是给人看的,字节是给计算机看的。 …

【SpringBoot】了解简单原理 Bean管理 配置优先级

文章目录 一、配置优先级1.1 命令行设置端口号1.2 打包后修改端口号1.3 优先级 小结 二、Bean的管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 三、剖析Springboot的底层原理3.1 起步依赖3.2 自动配置3.2.1 第三方类装配3.2.2 原理分析 总结Web后端开发总结:源码跟…

计算机专业学习单片机有什么意义吗?

玩单片机跟玩计算机区别还是很大的, 单片机有众多的种类,每一种又可能有很多个系列.可以说单片机就是为了专款专用而生的.这样来达到产品成本的降低,这就是现在身边的很多的电子产品价格一降再降的原因之一.在开始前我有一些资料,是我根据网友给的问题精心整理了一…

阅读FAST-LIO2(Lidar-IMU)论文

一、摘要 本文介绍了 FAST-LIO2:一种快速、稳健且通用的 LiDAR 惯性里程计框架。 FASTLIO2 建立在高效紧耦合迭代卡尔曼滤波器的基础上,具有两个关键创新,可实现快速、稳健和准确的 LiDAR 导航(和映射)。第一个是直接将…

热门主食冻干希喂/PURPOSE/百利测评对比!真实喂养分享!

在当今科学养宠的时代里,主食冻干已经成为猫咪日常饮食的重要一环。主食冻干的高肉含量特性使其易于被猫咪吸收和消化,同时,它还能提供其他猫粮所无法提供的微量物质,满足猫咪的全面营养需求。然而,面对市面上众多品牌…

Java SPI 机制

SPI 机制的定义 在Java中,SPI(Service Provider Interface)机制是一种用于实现软件组件之间松耦合的方式。它允许在应用程序中定义服务接口,并通过在类路径中发现和加载提供该服务的实现来扩展应用程序功能。 SPI 机制通常涉及三…

信创实力进阶,Smartbi再获华为云鲲鹏技术认证

日前,经华为技术有限公司评测,思迈特商业智能与数据分析软件Smartbi Insight V11与华为技术有限公司Kunpeng 920 Taishan 200完成并通过相互兼容性测试认证,成功再获华为云鲲鹏技术认证书,标志着Smartbi与华为云鲲鹏产业生态合作更…

动态规划相关题目

文章目录 1.动态规划理论基础2.斐波那契数3.爬楼梯4.使用最小花费爬楼梯5.不同路径6.不同路径 II7. 整数拆分8. 不同的二叉搜索树 1.动态规划理论基础 1.1 什么是动态规划? 动态规划,英文:Dynamic Programming,简称DP,如果某一…

nginx mirror 流量镜像

流量镜像 (Traffic Mirroring),也称为流量影子 (Traffic Shadowing),是一种强大的、无风险的测试应用版本的方法,它将实时流量的副本发送给被镜像的服务。 采用这种方法,您可以搭建一个与原环境类似的环境以进行验收测试&#xff…

【ARM 嵌入式 C 入门及渐进 18 -- 字符数字转整形函数 atoi 介绍】

请阅读【嵌入式开发学习必备专栏 】 文章目录 字符数字转整形函数 atoiatoi 简单实现 字符数字转整形函数 atoi 在 C 语言中,main 函数能够接收命令行参数。这些参数通过两个参数传递给 main 函数:int argc 和 char *argv[]。argc 是命令行参数的数量&a…

安卓逆向 | JEB静态分析APK

JEB反编译APK-静态审计,找到加密算法 参考来源:https://blog.csdn.net/weixin_38819889/article/details/108910525 apk来源:https://app5.scrape.center/ 软件&工具:JEB / 雷电模拟器 / burpsuite 声明:scrape.ce…

YOLOv9+单目测距(python)

YOLOv9+单目测距(python) 1. 相关配置2. 测距原理和相机标定2.1 测距原理2.2 相机标定3. 相机测距3.1 测距模块3.2 测距添加3.3 主代码4. 实验效果相关链接 1. YOLOV7 + 单目测距(python) 2. YOLOV5 + 单目测距(python)

C#-特性Attribute的定义、使用及常用特性(不定时更新)

目录 一、 特性的定义及使用 1.自定义特性 2.使用特性 3.查找特性名 4.获取相应对象的特性名 二、常用部分特性 一、 特性的定义及使用 1.自定义特性 全继承自Attribute基类(使用前要给自定义特性赋予相关特性) [AttributeUsage(AtrributeTargets.Class|AttributeTar…

MySQL执行计划分析实战:从实例场景出发深度解读各项参数与分析步骤

引言: 在MySQL数据库优化中,理解和分析SQL执行计划是一项至关重要的技能。通过执行计划,我们可以洞察MySQL如何执行SQL查询,以及它选择索引、决定查询顺序和计算行数的方式。本文将通过一个实例场景,详细阐述MySQL执行…

浅模仿小米商城布局(有微调)

CSS文件 *{margin: 0;padding: 0;box-sizing: border-box; }div[class^"h"]{height: 40px; } div[class^"s"]{height: 100px; } .h1{width: 1528px;background-color: green; } .h11{background-color:rgb(8, 220, 8); } .h111{width: 683px;background-c…

ITSS评估过程

基于ITSS标准与《信息技术服务 运行维护 第1部分:通用要求》标准,建立和实施合适企业自身业务需要、同时符合《信息技术服务 运行维护 第1部分:通用要求》标准的服务管理体系,并满足《信息技术服务 运行维护 第1部分:通…

记录服务器被挖矿程序到账cpu爆满(治标不治本)

被入侵,要么是密码泄露,要么是端口攻击。 1.执行top命令。找到进程占用cpu爆满的pid ,然后kill -9 pid。 2.写定时任务执行脚本监测删除 建立清理挖矿脚本文件 #清理挖矿脚本_1: kill_xmrig.shfind / -name "*xmrig*" -exec rm…

【差分约束+并查集】第十三届蓝桥杯省赛C++ A组 Java A组/研究生组《推导部分和》(C++)

【题目描述】 【输入格式】 【输出格式】 【数据范围】 【输入样例】 5 3 3 1 5 15 4 5 9 2 3 5 1 5 1 3 1 2 【输出样例】 15 6 UNKNOWN 【思路】 题解来源&#xff1a;AcWing 4651. $\Huge\color{gold}{推导部分和}$ - AcWing 【代码】 #include<bits/stdc.h> #define…

PostgreSQL FDW(外部表) 简介

1、FDW: 外部表 背景 提供外部数据源的透明访问机制。PostgreSQL fdw(Foreign Data Wrapper)是一种外部访问接口,可以在PG数据库中创建外部表,用户访问的时候与访问本地表的方法一样,支持增删改查。 而数据则是存储在外部,外部可以是一个远程的pg数据库或者其他数据库(…