当前位置: 首页 > 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;同时又不改变其…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...