SpringBoot的自动配置核心原理及拓展点

Spring Boot 的核心原理几个关键点

  1. 约定优于配置

    • Spring Boot 遵循约定优于配置的理念,通过预定义的约定,大大简化了 Spring 应用程序的配置和部署。例如,它自动配置了许多常见的开发任务(如数据库连接、Web 服务器配置等),使得开发人员可以专注于业务逻辑而不是繁琐的配置。
  2. 自动配置

    • Spring Boot 的自动配置(Auto-Configuration)机制是其核心功能之一。它通过在类路径下的 META-INF/spring.factories 文件中定义的配置类,根据应用程序的依赖关系和条件自动配置 Spring 环境。这样可以避免手动配置大量的 Spring 组件和 bean,显著简化了项目的初始化和配置过程。
  3. 起步依赖

    • Spring Boot 提供了大量的起步依赖(Starter Dependencies),它们是预配置的依赖项集合,可以快速地集成常见的技术栈(如Web 开发、数据访问、安全性等)。起步依赖不仅包含了必要的依赖库,还包含了相应的自动配置,使得整合第三方库变得简单和快速。
  4. 内嵌容器

    • Spring Boot 默认集成了多种内嵌的 Web 容器(如Tomcat、Jetty、Undertow),可以直接打包为可执行的 JAR 文件。这种方式简化了部署和运行 Spring 应用程序的过程,不需要额外部署外部的 Web 服务器。
  5. Actuator

    • Spring Boot Actuator 是一个用于监控和管理应用程序的功能模块,可以通过 HTTP、JMX 等多种方式暴露应用程序的内部信息和健康状况。Actuator 提供了许多内置的端点(Endpoints),例如 /actuator/health/actuator/info 等,用于查看应用程序的运行状态和详细信息。
  6. 外部化配置

    • Spring Boot 支持通过外部配置文件(如 application.properties 或 application.yml)来管理应用程序的配置。这些配置文件可以包含不同环境(如开发、测试、生产)的配置选项,允许在不同环境中灵活地切换配置项而无需修改代码。
  7. 注解驱动

    • Spring Boot 鼓励使用注解驱动的开发方式,例如 @SpringBootApplication@RestController@Service 等。这些注解简化了开发人员对 Spring 组件的声明和管理,提高了代码的可读性和维护性。
  8. 外部插件和扩展

    • 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开启自动配置的核心。详细流程如下

  1. 具体有@Import({AutoConfigurationImportSelector.class})实现批量导入配置组件容器的功能。
  2. 导入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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP校园论坛-计算机毕业设计源码08586

摘 要 本项目旨在基于PHP技术设计与实现一个校园论坛系统,以提供一个功能丰富、用户友好的交流平台。该论坛系统将包括用户注册与登录、帖子发布与回复、个人信息管理等基本功能,并结合社交化特点,增强用户之间的互动性。通过利用PHP语言及其…

核方法总结(四)——高斯过程回归学习笔记

一、定义 基于核方法的线性回归模型和传统线性回归一样,可以用未知数据进行预测,但不能确定 预测的可信度。在参考书第二章中可知,基于贝叶斯方法可以实现对未知数据依概率预测,进而可得到预测的可信度。这一方法中,通…

试用笔记之-收钱吧安卓版演示源代码,收钱吧手机版感受

首先下载: https://download.csdn.net/download/tjsoft/89499105 安卓手机安装 如果有收钱吧帐号输入收钱吧帐号和密码。 如果没有收钱吧帐号点我的注册 登录收钱吧帐号后就可以把手机当成收钱吧POS机用了,还可以扫客服的付款码哦 源代码技术交流QQ:42…

数据架构深度解析

写在前面 在信息化高度发达的今天,数据已成为企业最宝贵的资产之一。如何有效地管理和利用这些数据,以支持企业的决策和业务运营,成为企业面临的重要挑战。数据架构作为数据管理的基础,其设计合理与否直接关系到数据的质量和价值。…

Vue3实现点击按钮实现文字变色

1.动态样式实现 1.1核心代码解释: class"power-station-perspective-item-text": 为这个 span 元素添加了一个 CSS 类,以便对其样式进行定义。 click"clickItem(item.id)": 这是一个 Vue 事件绑定。当用户点…

算法金 | 协方差、方差、标准差、协方差矩阵

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 1. 方差 方差是统计学中用来度量一组数据分散程度的重要指标。它反映了数据点与其均值之间的偏离程度。在…

【LINUX】内核源码文件系统调用相关摸索

首先,先看看想测试那个系统调用,在应用层,如果使用C语言编程一般我们一来就是open函数,实际在测试的时候,直接用touch xxx.txt然后 echo "xxx" >> xxx.txt,这样就完成了文件创建和写文件的…

idea 用久了代码提示变慢卡顿优化

idea 用久了代码提示变慢卡顿优化 修改虚拟机配置 修改编译构建堆内存

CesiumJS【Basic】- #028 天空盒

文章目录 天空盒1 目标2 代码2.1 main.ts3 资源天空盒 1 目标 配置显示天空盒 2 代码 2.1 main.ts import * as Cesium from cesium;// 创建 Cesium Viewer 并配置地形数据和天空盒 const viewer = new Cesium.Viewer(

【Python系列】列表推导式:简洁而强大的数据操作工具

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

最强文生图模型Stable Diffusion 3 Medium 正式开源

Stability AI 宣布 Stable Diffusion 3 Medium 现已开源,是 Stable Diffusion 3 系列中最新、最先进的文本生成图像 AI 模型 —— 官方声称是 “迄今为止最先进的开源模型”,其性能甚至超过了 Midjourney 6。 Stable Diffusion 3 Medium 模型规格参数达到…

用友U8 Cloud smartweb2.showRPCLoadingTip.d XXE漏洞复现

0x01 产品简介 用友U8 Cloud 提供企业级云ERP整体解决方案,全面支持多组织业务协同,实现企业互联网资源连接。 U8 Cloud 亦是亚太地区成长型企业最广泛采用的云解决方案。 0x02 漏洞概述 用友U8 Cloud smartweb2.showRPCLoadingTip.d 接口处存在XML实体,攻击者可通过该漏…

redis实战-短信登录

基于session的登录流程 session的登录流程图 1. 发送验证码 用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号 如果手机号合法,后台此时生成对应的验证码,同时将验证码进行保存&#x…

昇思25天学习打卡营第七天|模型训练

背景 提供免费算力支持,有交流群有值班教师答疑的华为昇思训练营进入第七天了。 今天是第七天,前六天的学习内容可以看链接 昇思25天学习打卡营第一天|快速入门 昇思25天学习打卡营第二天|张量 Tensor 昇思25天学习打卡营第三天|数据集Dataset 昇思25天…

51单片机第17步_外部中断

本章重点学习外部中断。 1、外部中断0框图&#xff1a; 2、外部中断1框图&#xff1a; 3、程序举例&#xff1a; #include <REG51.h> //包含头文件REG51.h,使能51内部寄存器; #include <intrins.h> //包含头文件intrins.h,要放在stdio.h的头文件之前; //使能…

[leetcode]圆圈中最后剩下的数字/ 破冰游戏

. - 力扣&#xff08;LeetCode&#xff09; class Solution {int f(int num, int target) {if (num 1) {return 0;}int x f(num - 1, target);return (target x) % num;} public:int iceBreakingGame(int num, int target) {return f(num, target);} };

基准测试程序的认知与分析 —— SPEC基准测试程序集的深入探索

基准测试程序的认知与分析 —— SPEC基准测试程序集的深入探索 一、实验目的&#xff1a; 了解和掌握Spec基准程序测试对基准程序测试结果进行分析和比较 二、实验准备知识&#xff1a; 计算机系统设计和分析的量化原则。 计算机系统设计和分析的量化原则是指导计算机系统架…

一篇就够了,为你答疑解惑:锂电池一阶模型-离线参数辨识(附代码)

锂电池一阶模型-参数离线辨识 背景模型简介数据收集1. 最大可用容量实验2. 开路电压实验3. 混合动力脉冲特性实验离线辨识对应模型对应代码总结下期预告文章字数有点多,耐心不够的谨慎点击阅读。 下期继续讲解在线参数辨识方法。 背景 最近又在开始重新梳理锂电池建模仿真与S…

【保姆级教程+配置源码】在VScode配置C/C++环境

目录 一、下载VScode 1. 在官网直接下载安装即可 2. 安装中文插件 二、下载C语言编译器MinGW-W64 三、配置编译器环境变量 1. 解压下载的压缩包&#xff0c;复制该文件夹下bin目录所在地址 2. 在电脑搜索环境变量并打开 3. 点击环境变量→选择系统变量里的Path→点击编…

羊了个羊:羊、羊、羊

一、I am me&#xff0c;羊羊羊 英文中的 我就是我&#xff08;I am me&#xff09;&#xff0c;其实就是&#xff1a;羊 羊 羊&#xff0c;为什么会有这么一个结论呢&#xff1f; 请往下看&#xff1a; I&#xff0c;就是羊 am&#xff08;是&#xff09;&#xff0c;也是羊 …
最新文章