当前位置: 首页 > news >正文

重学SpringBoot3-自动配置机制

重学SpringBoot3-自动配置机制

  • 引言
  • Spring Boot 自动配置原理
  • 示例:Spring Boot Web 自动配置
  • 深入理解
  • 总结
  • 相关阅读

引言

Spring Boot 的自动配置是其最强大的特性之一,它允许开发者通过最少的配置实现应用程序的快速开发和部署。这一切都得益于 Spring Boot 的 “约定优于配置” 的设计理念。本教程将带你了解 Spring Boot 自动配置的背后原理,并通过示例解释其工作方式。

Spring Boot 自动配置原理

Spring Boot 自动配置的核心是一系列自动配置类,这些类通常基于类路径中的存在和属性值来条件性地配置应用程序。

主要步骤如下:

  1. 启动类:每个 Spring Boot 应用都有一个启动类,通常使用 @SpringBootApplication 注解。这个注解是一个组合的注解,它包含了 @EnableAutoConfiguration,后者是自动配置的关键。

  2. @EnableAutoConfiguration:这个注解告诉 Spring Boot 开始扫描候选自动配置类,并应用它们。这些候选自动配置类通常通过 spring.factories 文件存放,该文件位于自动配置模块的 META-INF/ 目录下。

  3. 条件注解:自动配置类使用条件注解(如 @ConditionalOnClass@ConditionalOnBean@ConditionalOnProperty 等)来确保只有在特定条件满足时才应用配置。例如,某个自动配置类可能只在某个类存在于类路径上时才激活。

  4. 属性绑定:自动配置过程还涉及将外部配置(如 application.propertiesapplication.yml)绑定到配置类上,进一步定制化自动配置。

相关源码:

从启动类开始

启动类

@SpringBootApplication 注解其实包含三个注解,自动配置相关的是 @EnableAutoConfiguration

@EnableAutoConfiguration

org.springframework.boot.autoconfigure.EnableAutoConfiguration:通过 @Import 导入自动配置模块的导入选择器AutoConfigurationImportSelector,它的作用是在启动时扫描指定包路径下的所有自动配置类,并根据应用程序的依赖关系和环境变量等信息,自动地选择需要引入的自动配置类,并将其注册为 Bean,以便应用程序可以正常使用这些自动配置的功能。

导入自动配置模块的选择器AutoConfigurationImportSelector

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#selectImports:该方法的主要作用是从给定的注解元数据中筛选出需要导入的包名。

selectImports方法

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry:用于获取自动配置项的入口点。该方法接受一个参数,即要获取的自动配置项的名称。它返回一个 AutoConfigurationEntry 对象,该对象包含了自动配置项的详细信息,如类路径、Bean 定义等。重点看该方法内调用的 getCandidateConfigurations() 方法。

getAutoConfigurationEntry()

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getCandidateConfigurations:这个方法的作用是获取候选的自动配置类列表。

getCandidateConfigurations()

org.springframework.boot.context.annotation.ImportCandidates#load:通过调用 ImportCandidates.load() 方法,从 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中加载候选的自动配置类,并将其存储在 configurations 变量中。

ImportCandidates.load()

org.springframework.boot.autoconfigure.AutoConfiguration.imports:存放了 SpringBoot 自动配置类,不同 SpringBoot 版本数量不同。

Spring Boot所有自动配置类

回到 org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry,会对读到所有的自动配置类进行筛选。

自动配置类进行筛选

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.ConfigurationClassFilter#filter:筛选条件就是使用条件注解(如 @ConditionalOnClass@ConditionalOnBean@ConditionalOnProperty 等)来确保只有在特定条件满足时才应用配置。

筛选符合条件的自动配置类

例如符合筛选条件的 org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration 自动配置类,类上带有 @EnableConfigurationProperties({ServerProperties.class}),既将配置文件(如 application.propertiesapplication.yml)中的属性绑定到带有 @ConfigurationProperties 注解的类 ServerProperties.class 对象上,从而达到引入 starter 配置少量参数就能运行的目的。

在这里插入图片描述

示例:Spring Boot Web 自动配置

假设你想创建一个简单的 Spring Boot Web 应用。你只需要做以下几步:

  1. 添加依赖:在 pom.xmlbuild.gradle 文件中添加 Spring Boot Starter Web 依赖。

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
  2. 创建启动类

    @SpringBootApplication
    public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
    }
    
  3. 编写控制器

    @RestController
    public class HelloController {@GetMapping("/")public String hello() {return "Hello, Spring Boot!";}
    }
    
  4. 配置文件

    server.port=8808
    

在这个例子中,spring-boot-starter-web 包含了 Spring MVCTomcat 作为默认的嵌入式服务器,以及其他 Web 开发所需的依赖。当你启动应用时,Spring Boot 的自动配置会检测到类路径上的 spring-webmvc 和嵌入式 Tomcat,并自动配置它们。这意味着你通过少量的配置或默认配置就可以运行一个基本的 Web 应用。

深入理解

  • 自定义自动配置:如果默认的自动配置不符合你的需求,你可以通过添加自定义配置来覆盖或补充默认配置。此外,你也可以通过排除特定的自动配置类来禁用它们。

  • 条件化配置:理解自动配置背后的条件逻辑对于高效使用 Spring Boot 非常重要。你可以查看特定自动配置类的源码,以了解它们是如何根据应用的状态和外部配置做出决策的。

总结

Spring Boot 的自动配置极大简化了 Spring 应用的配置工作,让开发者可以专注于应用逻辑的实现,而非繁琐的配置。通过合理利用自动配置和条件注解,你可以快速地构建出既强大又灵活的 Spring 应用。了解并掌握 Spring Boot 自动配置的原理和使用方法,将有助于你更高效地开发 Spring Boot 应用。

相关阅读

重学SpringBoot3-@Import注解的作用
重学SpringBoot3-@ConditionalOnXxx条件注解
重学SpringBoot3-@ConditionalOnXxx条件注解
重学SpringBoot3-@EnableConfigurationProperties注解

相关文章:

重学SpringBoot3-自动配置机制

重学SpringBoot3-自动配置机制 引言Spring Boot 自动配置原理示例&#xff1a;Spring Boot Web 自动配置深入理解总结相关阅读 引言 Spring Boot 的自动配置是其最强大的特性之一&#xff0c;它允许开发者通过最少的配置实现应用程序的快速开发和部署。这一切都得益于 Spring …...

sql基本语法+实验实践

sql语法 注释&#xff1a; 单行 --注释内容# 注释内容多行 /* 注释内容 */数据定义语言DDL 查询所有数据库 show databases;注意是databases而不是database。 查询当前数据库 select database();创建数据库 create database [if not exists] 数据库名 [default charset 字符…...

Node.js中的并发和多线程处理

在Node.js中&#xff0c;处理并发和多线程是一个非常重要的话题。由于Node.js是单线程的&#xff0c;这意味着它在任何给定时间内只能执行一个任务。然而&#xff0c;Node.js的事件驱动和非阻塞I/O模型使得处理并发和多线程变得更加高效和简单。在本文中&#xff0c;我们将探讨…...

node.js 封装分页查询

node.js封装sql分页查询 方法&#xff1a; /*** 生成分页查询sql* param {string} table 表名* param {number} pageNum 分页页数 * param {number} pageSize 分页条数 * param {object} query 查询对象 例&#xff1a;{id:1,name:小明}* returns sql语句*/ const limit (ta…...

iptables 基本使用

iptables 主要用到两个表&#xff1a;filter 和 nat&#xff0c;其中 filter 表可以用来过滤数据包&#xff1b;nat 可以用来修改数据包的源地址和目的地址。 chain chain 是 table 中对数据包进行匹配的规则&#xff0c;对于 filter 来说 chain 有 INPUT & OUTPUT & …...

食品笔记()

吃东西有时不注意&#xff0c;就容易不舒服&#xff0c;记录下。 辣椒 辣椒真是个让人又爱又恨的东西。 看着想吃&#xff0c;吃着过瘾&#xff0c;吃完容易肚子疼。 主要是这东西本身就会刺激身体&#xff0c;即使是能吃辣的人&#xff0c;也容易造成肠胃发炎。 适量吃些即…...

C++入门和基础

目录 文章目录 前言 一、C关键字 二、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 2.3 标准命名空间 三、C输入&输出 四、缺省参数 4.1 缺省参数的概念 4.2 缺省参数的分类 五、函数重载 5.1 函数重载的简介 5.2 函数重载的分类 六、引用 6.1 引用的…...

一些C语言知识

C语言的内置类型&#xff1a; char short int long float double C99中引入了bool类型&#xff0c;用来表示真假的变量类型&#xff0c;包含true&#xff0c;false。 这个代码的执行结果是什么&#xff1f;好好想想哦&#xff0c;坑挺多的。 #include <stdio.h>int mai…...

代码工具APEX的入门使用(未包含安装)

第一次使用APEX是2019年&#xff0c;这个技术成名已久只是我了解的比较晚。请看Oracle ACE的网站&#xff0c;这就是用APEX做的。实际上有一次我看O记的人操作他们的办公流程&#xff0c;都是用APEX做的。 那一年&#xff0c;我用APEX做了一个CMDB的管理系统。那时候还没有流行…...

负载均衡.

简介: 将请求/数据【均匀】分摊到多个操作单元上执行&#xff0c;负载均衡的关键在于【均匀】。 负载均衡的分类: 网络通信分类 四层负载均衡:基于 IP 地址和端口进行请求的转发。七层负载均衡:根据访问用户的 HTTP 请求头、URL 信息将请求转发到特定的主机。 载体维度分类 硬…...

Git 指令深入浅出【2】—— 分支管理

Git 指令深入浅出【2】—— 分支管理 分支管理1. 常用分支管理指令2. 合并分支合并冲突合并模式 3. 实战演习 分支管理 1. 常用分支管理指令 # 查看本地分支 git branch# 查看远程分支 git branch -r# 查看全部分支 git branch -aHEAD 指向的才是当前的工作分支 # 查看当前分…...

工作流/任务卸载相关开源论文分享

decima-sim 概述&#xff1a; 图神经网络强化学习处理多工作流 用的spark的仿真环境&#xff0c;mit的论文&#xff0c;价值很高&#xff0c;高被引&#xff1a;663仓库地址&#xff1a;https://github.com/hongzimao/decima-sim论文&#xff1a;https://web.mit.edu/decima/co…...

为什么要用Python?

为什么要用Python&#xff1f; Python简单易用&#xff1a;提供大量的简单易用数据结构和内置库&#xff0c;语法结构也很简单易读&#xff0c;不需要使用括号来进行代码块分组&#xff0c;也不需要预声明变量或参数。Python开发效率高&#xff1a;简单易用的前提下&#xff0…...

北京大学发布,将试错引入大模型代理学习!

引言&#xff1a;探索语言智能的新边界 在人工智能的发展历程中&#xff0c;语言智能始终是一个核心的研究领域。随着大语言模型&#xff08;LLM&#xff09;的兴起&#xff0c;我们对语言智能的理解和应用已经迈入了一个新的阶段。这些模型不仅能够理解和生成自然语言&#x…...

Java 设计模式

编程设计模式六大原则 开闭原则&#xff08;Open Close Principle&#xff09;&#xff1a;对扩展开放&#xff0c;对修改关闭。在程序需要进行拓展的时候&#xff0c;不能去修改原有的代码&#xff0c;实现一个热插拔的效果。简言之&#xff0c;是为了使程序的扩展性好&#…...

Kivy和BeeWare 开发APP的优缺点,及其发展历史

Kivy和BeeWare都是流行的Python框架&#xff0c;用于开发移动应用。它们各自有独特的特点和优势&#xff0c;同时也面临一些挑战和限制。下面是对这两个框架的开发优缺点及其发展历史的总结。 Kivy 发展历史 起源&#xff1a;Kivy诞生于2010年&#xff0c;旨在提供一个用于P…...

C++递推

统计每个月兔子的总数 #include<bits/stdc.h> using namespace std; int n,sum0; void f(int); int main() {int a[1000];cin>>n;a[1]1;a[2]2;for(int i3;i<1000;i){a[i]a[i-1]a[i-2];}cout<<a[n];return 0; } void f(int n){}猴子吃桃子 #include<b…...

C++ 面试题

一、基础语法 1. C 和 C的区别 i. C是面向对象的的编程语言&#xff0c;C是面向过程的编程语言 ii. C中的内存分配运算符是new/delete而C 中是malloc和free iii. C中有函数重载而C 中没有 iv. C中新增了引用的概念而C 中只有值和指针 2. struct 和 class的区别 i. struc…...

MySQL之索引详解

华子目录 索引概述优缺点 索引的原理索引的设计原则索引结构B-tree&#xff08;多路平衡查找树&#xff09;BtreeHash 为什么InnoDB存储引擎选择Btree&#xff1f;索引分类聚集索引选取规则 单列索引和多列索引前缀索引创建索引1.创建表时创建索引2.在已经存在的表上创建索引3.…...

Java面试题总结8:springboot

Spring Boot自动配置原理 importConfigurationSpring spi 自动配置类由各个starter提供&#xff0c;使用ConfigurationBean定义配置类&#xff0c;放到META-INF/spring.factories下 使用Spring spi扫描META-INF/Spring.factories下的配置类 如何理解Spring Boot中Starter …...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...