Spring Boot 自动配置
1. Spring Boot 自动配置
Spring Boot的自动配置是其核心特性之一,旨在简化Spring应用程序的配置过程。这个特性通过合理的默认值以及根据类路径和其他因素自动配置Spring Beans来极大地减少了配置的工作量。以下是Spring Boot自动配置的详细讲解:
基本原理
- 条件化配置:Spring Boot使用了一种条件化的配置方法。这意味着它会在运行时检查某些条件(如类路径上的类、环境属性、系统属性等),基于这些条件决定是否应用某个配置。
@EnableAutoConfiguration注解:这是Spring Boot自动配置的核心。当你使用@SpringBootApplication注解时,实际上包含了@EnableAutoConfiguration。这个注解告诉Spring Boot开始扫描自动配置候选项。
自动配置的工作方式
- 类路径扫描:Spring Boot会检查类路径上的库,根据这些库来决定需要配置哪些Bean。例如,如果类路径上有H2数据库的库,Spring Boot会自动配置一个内存数据库。
- 配置类:Spring Boot有许多内置的配置类,这些类使用
@Conditional相关注解来控制配置的应用。例如,DataSourceAutoConfiguration类用于自动配置数据源。 - 外部化配置:Spring Boot允许通过外部配置(如
application.properties或application.yml文件,环境变量等)来覆盖自动配置的默认值。这提供了高度的灵活性。
优点
- 减少配置:自动配置大大减少了显式配置的需求,使得启动和运行Spring应用程序更加快速和简单。
- 智能默认值:Spring Boot提供了许多合理的默认设置,这些设置通常适用于多数标准场景。
- 易于重写:尽管自动配置提供了默认值,但它们很容易被开发者自己的配置所覆盖和调整。
如何控制自动配置
- 排除特定的自动配置:可以使用
@EnableAutoConfiguration注解的exclude属性来排除特定的自动配置类。 - 使用
application.properties或application.yml:可以在这些文件中定义属性来覆盖自动配置提供的默认值。 - 了解自动配置报告:Spring Boot提供了一个自动配置报告,它可以告诉你哪些自动配置被应用,哪些没有,以及为什么。这可以通过启动时设置
--debug标志来查看。
使用实例
假设你正在创建一个Web应用程序,且在类路径上有Spring Web MVC和Tomcat。在这种情况下,Spring Boot将自动配置Tomcat作为嵌入式服务器,并配置Spring MVC。
注意事项
- 理解自动配置:虽然自动配置简化了很多设置,但完全理解它做了什么以及如何做的仍然很重要。这有助于更好地控制和调试应用程序。
- 与显式配置结合:在某些情况下,可能需要将自动配置和显式配置结合使用,以满足特定的应用程序需求。
总而言之,Spring Boot的自动配置是一个强大的特性,它可以帮助开发者更快地搭建和配置Spring应用程序,同时保持了灵活性和控制力。
2. 结合Redis来理解自动配置的流程:
结合Redis来讲解Spring Boot自动配置的流程,我们可以通过以下步骤来理解这个过程:
1. 引入依赖
首先,在Spring Boot项目的pom.xml或build.gradle文件中加入Redis的依赖。例如,使用Maven时添加如下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
这个依赖包含了Spring Data Redis和相关的库。
2. 类路径检测
当应用程序启动时,Spring Boot自动配置机制会检测类路径上的库。因为我们已经加入了spring-boot-starter-data-redis依赖,Spring Boot会检测到Redis相关的类和库。
3. 激活自动配置
由于@SpringBootApplication注解包含了@EnableAutoConfiguration,Spring Boot会尝试对所有在classpath中发现的组件进行自动配置。对于Redis来说,它会尝试自动配置与Redis交互所需的组件,如RedisTemplate和连接工厂等。
4. 条件化配置
Spring Boot使用条件化配置(通过@Conditional注解系列)来判断是否应该应用某个自动配置。例如,对于Redis,它可能会检查以下条件:
RedisAutoConfiguration是否在类路径上。- 是否存在配置来定义Redis服务器的连接细节,如主机名和端口。
5. 读取外部配置
Spring Boot会读取应用程序的配置文件(application.properties或application.yml),以获取Redis服务器的配置信息,如主机名、端口、密码等。例如:
spring.redis.host=localhost
spring.redis.port=6379
如果未提供这些配置,Spring Boot会使用默认值(例如,默认端口为6379)。
6. 配置Bean
满足上述条件后,Spring Boot自动配置Redis相关的Bean。这通常包括:
RedisConnectionFactory:用于创建与Redis服务器的连接。RedisTemplate和StringRedisTemplate:用于在应用程序中方便地操作Redis。
7. 运行时使用
一旦这些Bean被自动配置,开发者就可以在应用程序中直接注入(例如,通过@Autowired)并使用它们来与Redis进行交互。
注意事项
- 定制化配置:如果自动配置不完全符合你的需求,你可以通过定义自己的配置Bean来覆盖它们。
- 版本兼容性:确保Spring Boot的版本与Redis依赖的版本兼容。
- 了解自动配置原理:理解Spring Boot自动配置的工作原理有助于更好地控制和调试应用程序。
通过这个例子,你可以看到Spring Boot的自动配置是如何减少配置的复杂性和提高开发效率的。
相关文章:
Spring Boot 自动配置
1. Spring Boot 自动配置 Spring Boot的自动配置是其核心特性之一,旨在简化Spring应用程序的配置过程。这个特性通过合理的默认值以及根据类路径和其他因素自动配置Spring Beans来极大地减少了配置的工作量。以下是Spring Boot自动配置的详细讲解: 基本…...
力扣labuladong一刷day13天双指针8道链表题
力扣labuladong一刷day13天双指针7道链表题 一、21. 合并两个有序链表 题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/ 思路:合并只需要新new一个虚拟头结点,然后遍历比较两个链表把较小的那一个顺序接在虚拟头结点后面。…...
【剑指offer|图解|链表】链表的中间结点 + 链表中倒数第k个结点
🌈个人主页:聆风吟 🔥系列专栏:数据结构、算法模板 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. ⛳️链表的中间结点二. ⛳️链表中倒数第k个结点📝结语 Ὄ…...
被环境变量虐过一遍获得的启示
Oracle数据库环境存在两个数据库版本12C及19C,在执行一些操作时需要设置对应版本的环境变量 计划登录12C环境,于是按如下方式设置环境变量 export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_HOME/product/12.2.0/dbhome_1 export ORACLE_S…...
关于Hbase的一些问题
HBase 1. RowKey如何设计,设计不好会产生什么后果 唯一原则:在设计上要保持RowKey的唯一性。 因为HBase中的数据是以KV的格式来存储的,所以如果向同一张表中插入RowKey相同的数据,旧的数据会被覆盖掉。 长度原则:建…...
level=warning msg=“failed to retrieve runc version: signal: segmentation fault“
安装docker启动后,发现里面没有runc版本信息 目前看是少了runc组件 那我们安装runc https://github.com/opencontainers/runc/releases/download/v1.1.10/runc.amd64 [rootlocalhost ~]# mv runc.amd64 /usr/bin/runc mv:是否覆盖"/usr/bin/runc&q…...
电力工作记录仪、智能安全帽、智能布控球助力智能电网建设
电力行业的建设和发展是国家经济发展的重要支撑,而智能电网作为电力系统的重要组成部分,它的安全高效运行关乎到整个电力系统乃至民生的稳定和安全。为了加快国家经济的发展以及满足人们对电力的需求和用电可靠性的要求,国家早在十二规划中就…...
【CSS】各百分比透明度 opacity 对应的 16 进制颜色值(例如:#FFFFFF80)
文章目录 使用:6位颜色值2位透明度值 color: #000000D4; /* 等价于 */ color: #000000; opacity : 0.83; /* 等价于 */ color: #000000; opacity : 83%; 对照表(0:完全透明,1:不透明) 透明度值百分百值十…...
有依次对应关系的数组X、Y、Z,如何排序其中一个X数组,使得另外的数组还与排序完成后的数组相对应(C语言实现)
1. 目的 有依次对应关系的数组X、Y、Z,排序其中一个X数组,使得另外的数组还与排序完成后的数组相对应,并打印出排序完成后的X、Y、Z数组。 2. 具体实现 以下面的这个对应关系为例,进行相应编程实现。 X [3.7,7.7,-6.6,1.5,-4.5…...
Mysql之聚合函数
Mysql之聚合函数 什么是聚合函数常见的聚合函数GROUP BYWITH ROLLUPHAVINGHAVING与WHERE的对比 总结SQL底层原理 什么是聚合函数 对一组数据进行汇总的函数,但是还是返回一个结果 聚合函数也叫聚集,分组函数 常见的聚合函数 1.AVG(): 求平均值 2.SUM() :…...
Flutter笔记:拖拽手势
Flutter笔记 拖拽手势 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/134485123 目 录 1. 概述2. 垂直拖…...
软件运维面试题
文章目录 面试题如销售签有一外地客户,要求实施人员在客户现场一周内完成所有项目实施,而标准实施一般为期一个月,针对以上情况实施人员应该如何应对?答案 当你觉得工作的付出和你的收入不成正比的时候你会怎么做?答案 在你进行实…...
代码随想录算法训练营第23期day53|1143.最长公共子序列、1035.不相交的线、53. 最大子序和
目录 一、1143.最长公共子序列 二、1035.不相交的线 三、53. 最大子序和 一、1143.最长公共子序列 力扣题目链接 class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size() 1, vector<int…...
MySQL 的执行原理(五)
5.6 再深入查询优化 5.6.1. 全局考虑性能优化 5.6.3.1. 为什么查询速度会慢 在尝试编写快速的查询之前,需要清楚一点,真正重要是响应时间。如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间。…...
如何快速将txt类型的日志文件转换为excel表格并进行数据分析报表统计图(如:饼图、折线图、柱状图)?
打开excel创建空白文档 选择一个txt文件 一动下面箭头↑竖线,可以拖拽左右调整要判断转换为一列的数据宽度 根据情况设置不同列的数据格式(每一列可以点击),设置好后点击【完成】 设置单元格数据格式 手动插入第一行为每列数据的…...
内网穿透的应用-如何在Docker中部署MinIO服务并结合内网穿透实现公网访问本地管理界面
文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼…...
关于Unity自带的保存简单且持久化数据PlayerPrefs类的使用
Unity的PlayerPrefs类是用于在游戏中保存和读取玩家偏好设置或其他简单数据的工具。它提供了一种简单的键值对存储方式,可以在游戏中持久化保存数据。 PlayerPrefs提供了三种类型的数据的处理:分别是int,float,string。 具体使用方法如下: …...
力扣贪心——跳跃游戏I和II
1 跳跃游戏 利用边界进行判断,核心就是判定边界,边界内所有步数一定是最小的,然后在这个边界里找能到达的最远地方。 1.1 跳跃游戏I class Solution {public boolean canJump(int[] nums) {int len nums.length;int maxDistance 0;int te…...
【SA8295P 源码分析 (三)】132 - GMSL2 协议分析 之 GPIO/SPI/I2C/UART 等通迅控制协议带宽消耗计算
【SA8295P 源码分析】132 - GMSL2 协议分析 之 GPIO/SPI/I2C/UART 等通迅控制协议带宽消耗计算 一、GPIO 透传带宽消耗计算二、SPI 通迅带宽消耗计算三、I2C 通迅带宽消耗计算四、UART 通迅带宽消耗计算系列文章汇总见:《【SA8295P 源码分析 (三)】Camera 模块 文章链接汇总 -…...
毕业论文GPT说:
作为一个计算机专业的大四学生,学过英语,微积分,离散数学,概率论与数理统计,线性代数,具体数学,数论,C语言,汇编语言,在网格机算、数据科学、机器学习与智能工…...
企业级即时通讯「删除消息」:六个场景叠加之后,复杂性超出你的想象
本文不是一上来就讲方案,而是带你还原真实的业务场景,看清楚复杂性是如何一层一层叠加上来的。每加一个场景,原来的解法就出现新的漏洞,直到六个场景同时存在,你才会明白为什么"删除一条消息"在企业级系统里…...
【计算机网络期末突击】FTP协议核心考点与出题人思维大揭秘(附模拟题)
【计算机网络期末突击】FTP协议核心考点与出题人思维大揭秘(附模拟题)作者: 培风图南以星河揽胜 标签: #计算机网络 #FTP协议 #期末复习 #TCP/IP #考试技巧📚 前言:为什么FTP是必考重点? 在计算…...
AI加速器硬件软件协同设计优化实践
1. 硬件软件协同设计概述在AI加速器领域,硬件软件协同设计已成为突破性能瓶颈的关键策略。传统AI加速器设计往往将硬件和软件视为独立部分,导致计算单元与数据流之间出现严重不匹配。这种割裂的设计方式会造成两个主要问题:计算单元因等待数据…...
PUBG绝地求生压枪脚本终极指南:5步实现罗技鼠标精准射击
PUBG绝地求生压枪脚本终极指南:5步实现罗技鼠标精准射击 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 在《绝地求生》这款硬核射击…...
AI赋能产品情绪价值:中国制造跳出同质化内卷的关键路径
前言:AI深度创作的15000字文章这篇文章是作者开始接触AI后近两年的思考与心得,借助AI工具深度创作而成,总字数15000字。这是一篇严肃、有深度、有价值的文章,预计阅读需要20分钟,希望能对读者工作提供启发和参考&#…...
超级钢琴密度算法:Amanous系统的架构与实现
1. 超级钢琴密度算法的技术背景 在传统钢琴演奏中,人类手指的生理限制将音符密度约束在约15-20个音符/秒的范围内。然而,现代自动演奏钢琴(如Yamaha Disklavier)通过电磁击弦机制和MIDI控制,理论上可以实现超过100音符…...
AC-GAN原理与Keras实现:从零构建条件生成对抗网络
1. 从零开始构建AC-GAN:原理与架构解析在深度学习领域,生成对抗网络(GAN)已经成为图像生成任务的重要框架。而辅助分类器生成对抗网络(AC-GAN)作为GAN的重要变体,通过引入类别信息显著提升了生成…...
直接转矩控制(DTC)技术解析与应用
1. 直接转矩控制(DTC)技术概述直接转矩控制(Direct Torque Control, DTC)是上世纪80年代中期由德国鲁尔大学Depenbrock教授和日本学者Takahashi分别提出的交流电机控制技术。与传统矢量控制(Vector Control)相比,DTC最大的特点是摒弃了固定开关频率的PWM调制方式&am…...
代码生成图像技术:原理、应用与优化策略
1. 技术背景与核心价值在数字内容创作领域,代码生成图像技术正在颠覆传统设计流程。这项技术允许开发者通过编写结构化代码描述来生成精确的视觉内容,其核心价值体现在三个维度:首先,它实现了设计意图的精确传递。与人工绘制可能产…...
DrivePI:基于MLLM的自动驾驶4D感知与控制
1. 项目背景与核心价值DrivePI这个项目名称本身就揭示了它的两大核心特征:"Drive"指向自动驾驶领域,"PI"则暗示了空间感知(Physical Interaction)能力。当我在2023年第一次接触到这个项目原型时,最…...
