重学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注解

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云哪款服务器最便宜划算?2024腾讯云服务器优惠价格表

腾讯云优惠活动2024新春采购节活动上线&#xff0c;云服务器价格已经出来了&#xff0c;云服务器61元一年起&#xff0c;配置和价格基本上和上个月没什么变化&#xff0c;但是新增了8888元代金券和会员续费优惠&#xff0c;腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

基于similarities的文本语义相似度计算和文本匹配搜索

similarities 实现了多种相似度计算、匹配搜索算法&#xff0c;支持文本、图像&#xff0c;python3开发。 安装 pip3 install torch # conda install pytorch pip3 install -U similarities或 git clone https://github.com/shibing624/similarities.git cd similarities py…

Stable Diffusion 模型分享:DucHaiten-AIart-SDXL(动漫、3D、逼真)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 这是一个丰富多彩的 SDXL 模型&#xff0c;可以绘制动漫、3D、科幻、真实等类型的图片。 …

仓储管理系统(WMS) 的研发历程-PRD撰写

题外话&#xff1a;PRD的展现形式有多种&#xff0c;有的人喜欢在axure上直接做产品描述&#xff0c;觉得word较为过时&#xff0c;有的人认为axure不专业&#xff0c;任何展现形式都无可厚非&#xff0c;重要的达到PRD的目的&#xff0c;PRD的目标是让团队知道需求实现细节&am…

LVS负载均衡群集之NAT与DR模式

一 集群和分布式 企业群集应用概述 群集的含义 Cluster&#xff0c;集群、群集 由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供一个访问入口(域名或IP地址)&#xff0c;相当于一台大型计算机。 问题&#xff1f; 互联网应用中&#xff0c;随着站点对…

python爬虫(2)

继上节 查看数组维数 可以使用数组的ndim属性 代码示例如下&#xff1a; import numpy as np c np.random.randint(1,9,5) print(c.ndim) 结果如下&#xff1a; 当然这些也可以结合前面的各种用法来使用 1、选取数组元素 &#xff08;1&#xff09;一维数组的元素…

Java引用传递及基本应用

在 Java 中&#xff0c;传递参数的方式主要有两种&#xff1a;值传递&#xff08;传递的是对象的引用值&#xff09;和引用传递。本教程将重点介绍 Java 中的引用传递以及其基本应用。 1. 引用传递概念 在 Java 中&#xff0c;所有的方法参数都是通过值传递的。对于对象类型的…

【数学建模】层次分析代码(python)

上一篇学习了层次分析的理论&#xff0c;今天用代码实现一下吧&#xff01; 判断矩阵的一致性检验 import numpy as np A np.array([[1,2,3,5],[1/2,1,1/2,2],[1/3,2,1,2],[1/5,1/2,1/2,1]]) n A.shape[0]#获取A的行 eig_val, eig_vecnp.linalg.eig(A)#计算方阵的特征值和特…

Java并发编程-实现多线程的四种方式

创建线程的四种方式 创建线程的四种方式包括使用继承 Thread 类、实现 Runnable 接口、使用 Callable 和 Future 接口以及利用线程池。每种方式都有其特定的优势和适用场景。通过继承 Thread 类或实现 Runnable 接口&#xff0c;可以定义线程要执行的任务&#xff0c;并通过调用…

【应用多元统计分析】--多元数据的描述和展示(R语言)

一元随机变量 我们用协方差来刻画两个变量的相关关系&#xff0c;这里指的是线性相关关系。 对于一元随机变量的可视化最简单的就是散点图&#xff0c;大致可以看出X和Y之间的相关关系。如果想更好的看X、Y之间的相关关系&#xff0c;可以画二维的散点图。 总结&#xff1a; 均…

HTML超详细简介

HTML是什么 超文本标记语言&#xff08;HyperText Mark-up Language &#xff09;用来设计网页的标记语言用该语言编写的文件&#xff0c;以 .html或 .htm为后缀由浏览器解释执行不区分大小写&#xff0c;建议小写 HTML标签 HTML用于描述功能的符号成为“标签”标签都封装在…

安卓手机如何使用JuiceSSH实现公网远程连接本地Linux服务器

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …