SpringBoot的自动配置核心原理及拓展点
Spring Boot 的核心原理几个关键点
-
约定优于配置:
- Spring Boot 遵循约定优于配置的理念,通过预定义的约定,大大简化了 Spring 应用程序的配置和部署。例如,它自动配置了许多常见的开发任务(如数据库连接、Web 服务器配置等),使得开发人员可以专注于业务逻辑而不是繁琐的配置。
-
自动配置:
- Spring Boot 的自动配置(Auto-Configuration)机制是其核心功能之一。它通过在类路径下的
META-INF/spring.factories
文件中定义的配置类,根据应用程序的依赖关系和条件自动配置 Spring 环境。这样可以避免手动配置大量的 Spring 组件和 bean,显著简化了项目的初始化和配置过程。
- Spring Boot 的自动配置(Auto-Configuration)机制是其核心功能之一。它通过在类路径下的
-
起步依赖:
- Spring Boot 提供了大量的起步依赖(Starter Dependencies),它们是预配置的依赖项集合,可以快速地集成常见的技术栈(如Web 开发、数据访问、安全性等)。起步依赖不仅包含了必要的依赖库,还包含了相应的自动配置,使得整合第三方库变得简单和快速。
-
内嵌容器:
- Spring Boot 默认集成了多种内嵌的 Web 容器(如Tomcat、Jetty、Undertow),可以直接打包为可执行的 JAR 文件。这种方式简化了部署和运行 Spring 应用程序的过程,不需要额外部署外部的 Web 服务器。
-
Actuator:
- Spring Boot Actuator 是一个用于监控和管理应用程序的功能模块,可以通过 HTTP、JMX 等多种方式暴露应用程序的内部信息和健康状况。Actuator 提供了许多内置的端点(Endpoints),例如
/actuator/health
、/actuator/info
等,用于查看应用程序的运行状态和详细信息。
- Spring Boot Actuator 是一个用于监控和管理应用程序的功能模块,可以通过 HTTP、JMX 等多种方式暴露应用程序的内部信息和健康状况。Actuator 提供了许多内置的端点(Endpoints),例如
-
外部化配置:
- Spring Boot 支持通过外部配置文件(如
application.properties
或application.yml
)来管理应用程序的配置。这些配置文件可以包含不同环境(如开发、测试、生产)的配置选项,允许在不同环境中灵活地切换配置项而无需修改代码。
- Spring Boot 支持通过外部配置文件(如
-
注解驱动:
- Spring Boot 鼓励使用注解驱动的开发方式,例如
@SpringBootApplication
、@RestController
、@Service
等。这些注解简化了开发人员对 Spring 组件的声明和管理,提高了代码的可读性和维护性。
- Spring Boot 鼓励使用注解驱动的开发方式,例如
-
外部插件和扩展:
- Spring Boot 支持许多外部插件和扩展,如 Spring Boot DevTools、Spring Boot CLI 等,这些工具和插件进一步增强了开发体验和生产效率。
总体来说,Spring Boot 的设计理念是通过简化配置、提供默认值、自动化任务等手段,使得开发者可以更加专注于业务逻辑的实现,同时显著降低了构建和部署 Spring 应用程序的复杂性和成本。
自动配置原理及自定义自动配置类
原理分析
从@SpringBootApplication 开始
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getCandidateConfigurations
org.springframework.core.io.support.SpringFactoriesLoader#loadSpringFactories
spring-boot 默认集成的自动配置类
注解@EnableAutoConfiguration是开启springboot开启自动配置的核心。详细流程如下
- 具体有@Import({AutoConfigurationImportSelector.class})实现批量导入配置组件容器的功能。
- 导入AutoConfigurationImportSelector的对象的selectImports方法返回的所有配置组件。
从spring-boot-autoconfig包中的Autoconfiguration.imports文件中读取需要加载的配置文件。但并不是所有配置都会生效,因为在所有的配置类上都有@ConditionalOnClass注解。当引入starter后,与之对应的@ConditionalOnClass就满足条件了,也就是相关的配置就生效了。
自动配置需要满足的条件,比如:
自定义自动配置类
在src/main/resources/META-INF/spring.factories
文件中添加自动配置类的引用:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.CustomAutoConfiguration
Spring Boot的启动器监听器
Spring Boot的启动器监听器(ApplicationRunner和CommandLineRunner)允许我们在应用程序启动后执行一些自定义逻辑。我们可以创建自己的启动器监听器来执行特定的初始化或后续操作。
选择使用 CommandLineRunner
还是 ApplicationRunner
取决于你需要处理的命令行参数的复杂性和类型。通常情况下,如果只需要简单地获取和打印命令行参数,可以选择 CommandLineRunner
;如果需要更复杂的参数解析或处理逻辑,推荐使用 ApplicationRunner
。
ApplicationRunner
ApplicationRunner
接口中的run
方法接收一个ApplicationArguments
对象作为参数,这个对象提供了更丰富的功能来处理应用程序启动时的参数。ApplicationArguments
对象不仅包含了原始的命令行参数数组,还提供了方便的方法来访问和解析命令行参数,包括非标记参数、选项参数等。- 适合处理复杂的命令行输入或需要更高级参数解析功能的初始化逻辑。
CommandLineRunner
CommandLineRunner
接口中的run
方法接收一个字符串数组作为参数,这个数组表示应用程序启动时传递的命令行参数。- 使用
CommandLineRunner
接口时,你可以直接访问原始的命令行参数数组,可以方便地处理简单的命令行参数,不需要进行复杂的解析。 - 适合处理基本的命令行输入或简单的初始化逻辑。
参考资料:
https://zhuanlan.zhihu.com/p/653791243
相关文章:

SpringBoot的自动配置核心原理及拓展点
Spring Boot 的核心原理几个关键点 约定优于配置: Spring Boot 遵循约定优于配置的理念,通过预定义的约定,大大简化了 Spring 应用程序的配置和部署。例如,它自动配置了许多常见的开发任务(如数据库连接、Web 服务器配…...

用随机森林算法进行的一次故障预测
本案例将带大家使用一份开源的S.M.A.R.T.数据集和机器学习中的随机森林算法,来训练一个硬盘故障预测模型,并测试效果。 实验目标 掌握使用机器学习方法训练模型的基本流程;掌握使用pandas做数据分析的基本方法;掌握使用scikit-l…...

24位DAC转换的FPGA设计及将其封装成自定义IP核的方法
在vivado设计中,为了方便的使用Block Desgin进行设计,可以使用vivado软件把自己编写的代码封装成IP核,封装后的IP核和原来的代码具有相同的功能。本文以实现24位DA转换(含并串转换,使用的数模转换器为CL4660)为例,介绍VIVADO封装IP核的方法及调用方法,以及DAC转换的详细…...

【大模型LLM面试合集】大语言模型基础_llm概念
1.llm概念 1.目前 主流的开源模型体系 有哪些? 目前主流的开源LLM(语言模型)模型体系包括以下几个: GPT(Generative Pre-trained Transformer)系列:由OpenAI发布的一系列基于Transformer架构…...

Qt时间日期处理与定时器使用总结
一、日期时间数据 1.QTime 用于存储和操作时间数据的类,其中包括小时(h)、分钟(m)、秒(s)、毫秒(ms)。函数定义如下: //注:秒(s)和毫秒(ms)有默认值0 QTime::QTime(int h, int m, int s 0, int ms 0) 若无须初始化时间数据,可…...
数据结构——Hash Map
1. Hash Map简介 Hash Map是一种基于键值对的数据结构,通过散列函数将键映射到存储位置,实现快速的数据查找和存储。它可以在常数时间内完成查找、插入和删除操作,因此在需要频繁进行这些操作时非常高效。 2. Hash Map的定义 散列表ÿ…...

剪画小程序:视频剪辑-视频播放倍数的调整与应用
在这个快节奏的时代,时间变得越来越宝贵,而视频倍数播放功能就像是我们的时间管理小助手,为我们的视频观看带来了极大的便利。你是否好奇它到底能在哪些地方发挥作用呢?让我们一起来看看! 只要使用小程序【剪画】的里…...

使用 Java Swing 和 XChart 创建多种图表
在现代应用程序开发中,数据可视化是一个关键部分。本文将介绍如何使用 Java Swing 和 XChart 库创建各种类型的图表。XChart 是一个轻量级的图表库,支持多种类型的图表,非常适合在 Java 应用中进行快速的图表绘制。 1、环境配置 在开始之前&…...

信息系统运维管理:实践与发展
信息系统运维管理:实践与发展 信息系统运维管理在现代企业中扮演着至关重要的角色,确保信息系统的高效、安全和稳定运行。本文结合《信息系统运维管理》文档内容,探讨了服务设计阶段、服务转换阶段、委托系统维护管理三个主要章节࿰…...

html+js+css登录注册界面
拥有向服务器发送登录或注册数据并接收返回数据的功能 点赞关注 界面 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>Login and Registration Form</title> <style> * …...
英伟达(NVIDIA)数据中心GPU介绍
英伟达(NVIDIA)数据中心GPU按性能由高到低排行: 1. NVIDIA H100 架构:Hopper 核心数量:18352 CUDA Cores, 1456 Tensor Cores 显存:80 GB HBM3 峰值性能: 单精度(FP32)…...
Leetcode 3202. Find the Maximum Length of Valid Subsequence II
Leetcode 3202. Find the Maximum Length of Valid Subsequence II 1. 解题思路2. 代码实现 题目链接:3202. Find the Maximum Length of Valid Subsequence II 1. 解题思路 这一题的话是上一题3201. Find the Maximum Length of Valid Subsequence I的升级版&am…...
通过Spring Boot结合实时流媒体技术对考试过程进行实时监控
本章将深入探讨考试系统中常见的复杂技术问题,并提供基于Spring Boot 3.x的解决方案。涵盖屏幕切换检测与防护、接打电话识别处理、行为监控摄像头使用、网络不稳定应对等,每篇文章详细剖析问题并提供实际案例与代码示例,帮助开发者应对挑战&…...
智能扫地机器人避障与防跌落问题解决方案
智能扫地机器人出现避障与防跌落问题时,可以通过以下几种方式来解决: 一、避障问题的解决方案 1.升级避障技术: ① 激光雷达避障:激光雷达通过发射和接收激光信号来判断与障碍物的距离,具有延迟低、效果稳定、准确度…...

德旺训练营称重问题
这是考小学的分治策略,小学的分治策略几乎都是分三组。本着这个策略,我们做看看。 第一次称重: 分三组,16,16,17,拿两个16称,得到A情况,一样重,那么假铜钱在那组17个里面。B情况不…...
数据决策系统详解
文章目录 数据决策系统的核心组成部分:1. **数据收集与整合**:2. **数据处理与分析**:3. **数据可视化**:4. **决策支持**: 数据决策系统的功能:决策类型:数据决策系统对企业的重要性࿱…...
JSON 简述与应用
1. JSON 简述 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于客户端与服务器之间的数据传递。它基于JavaScript对象表示法,但独立于语言,可以被多种编程语言解析和生成。 1.1 特点 轻量级&#…...

ResNet50V2
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、ResNetV1和ResNetV2的区别 ResNetV2 和 ResNetV1 都是深度残差网络(ResNet)的变体,它们的主要区别在于残差块的设计和…...
基于深度学习的虚拟换装
基于深度学习的虚拟换装技术旨在通过计算机视觉和图像处理技术,将不同的服装虚拟地穿在用户身上,实现快速的试穿和展示。这项技术在电商、时尚和虚拟现实领域具有广泛的应用,能够提升用户体验,增加互动性。以下是关于这一领域的系…...

单段时间最优S型速度规划算法
一,背景 在做机械臂轨迹规划的单段路径的速度规划时,除了参考《Trajectory Planning for Automatic Machines and Robots》等文献之外,还在知乎找到了这位大佬 韩冰 写的在线规划方法: https://zhuanlan.zhihu.com/p/585253101/e…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...