重学SpringBoot3-SPI机制

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-SPI机制

  • 什么是 SPI?
  • Spring Boot 中的 SPI 机制
    • spring.factories 文件
    • 自动配置的实现
    • 启动流程中的作用
  • SPI实际应用
    • 步骤 1: 新建模块
    • 步骤 2: 创建自动配置类
    • 步骤 3: 注册自动配置类
    • 步骤 4: 使用
    • 步骤 5: 测试
  • 最佳实践与注意事项
    • 1. 明确条件注解
    • 2. 避免类路径问题
    • 3. 使用 `@ConditionalOnMissingBean`
    • 4. 文档和示例
    • 5. 分离自动配置和业务逻辑
  • 总结

Spring Boot 的核心特性之一是其强大的自动配置功能,它极大地简化了 Spring 应用程序的配置。这种自动配置部分依赖于 Spring Boot 的服务提供者接口(SPI)机制,它允许开发者以模块化和可插拔的方式扩展和定制框架行为。接下来将详细探讨 Spring Boot 3 中的 SPI 机制,并通过示例展示如何实际使用它来实现。

什么是 SPI?

SPI(Service Provider Interface)即服务提供者接口,是一种服务发现机制,允许开发者和框架发现和加载可用的服务实现,而不需要在代码中硬编码具体的实现。这种机制使得软件系统能够更加灵活和可扩展。

在 Java 平台上,SPI 通常是通过 java.util.ServiceLoader 类实现的,但 Spring Boot 对这一概念进行了扩展,以支持其自动配置和模块化架构。

Spring Boot 中的 SPI 机制

Spring Boot 利用 spring.factories (注意:从 SpringBoot 2.7 起自动配置不推荐使用 /META-INF/spring.factories 文件,而是在/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports)文件,位于每个项目根目录的 META-INF/ 目录下,来实现其 SPI 机制。这个文件列出了与自动配置相关的接口及其实现类,Spring Boot 启动时会加载这些配置。

spring.factories 文件

这个文件使用键值对的格式列出了多种服务类型及其对应的实现类,常见的服务类型包括:

  • org.springframework.boot.autoconfigure.EnableAutoConfiguration:用于自动配置。
  • org.springframework.context.ApplicationListener:用于应用事件监听器。
  • org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider:用于模板引擎的可用性判断。

以下是 spring.factories 文件的一个典型例子:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.JpaAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfigurationorg.springframework.context.ApplicationListener=\
com.example.MyApplicationListener

Spring Boot 3 则要在 resources/META_INFO/spring/ 目录下新建 org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,并填入需要自动配置的类的全路径:

com.example.JpaAutoConfiguration

自动配置的实现

在 Spring Boot 中,自动配置类使用 @ConditionalXxx 注解来控制配置类的加载条件。这允许 Spring Boot 根据当前应用的环境,如类路径上的类、环境变量、系统属性等,条件性地应用配置,例如,一个自动配置类可能只在 JPA 实体类存在时才加载:

@Configuration
@ConditionalOnClass(name = "javax.persistence.Entity")
public class JpaAutoConfiguration {// 配置 JPA 相关的 beans
}

启动流程中的作用

在 Spring Boot 的启动流程中,当 SpringApplication 类被调用时,它将初始化一个 SpringApplicationContext。在这个过程中,Spring Boot 通过 SpringFactoriesLoader 类来加载 spring.factoriesorg.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中定义的各种组件,包括自动配置类。然后,根据应用的实际环境(比如类路径上的库和定义的 Beans),以及自动配置类上的条件注解,决定是否激活这些自动配置类。

SPI实际应用

让我们通过一个自定义 stater 示例来展示如何创建和使用自定义的自动配置。

步骤 1: 新建模块

自定义的 starter 不需要启动类,需要删掉。

步骤 2: 创建自动配置类

创建一个自动配置类,这个类将提供一个服务,仅在某个特定的类如 SpecificClass 存在于启动类类路径上时才加载 MyService 类型的 bean。

package com.coderjia.spi.config;import com.coderjia.spi.service.MyService;
import com.coderjia.spi.service.impl.MyServiceImpl;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author CoderJia* @create 2024/5/5 下午 03:29* @Description**/@Configuration
@ConditionalOnClass(name = "com.coderjia.features.config.SpecificClass")
public class MyAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic MyService MyService() {return new MyServiceImpl();}
}

MyService 类简单实现:

public class MyServiceImpl implements MyService {@Overridepublic void sayHello() {System.out.println("hello");}
}

步骤 3: 注册自动配置类

接下来,SpringBoot 2.7 以下在模块的 META-INF/spring.factories 文件中注册这个自动配置类:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.coderjia.spi.config.MyAutoConfiguration

SpringBoot 2.7 及以上在 /META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中添加自动配置类:

com.coderjia.spi.config.MyAutoConfiguration

这样配置后,只要 SpecificClass 类存在于类路径上,Spring Boot 就会自动配置 MyService

步骤 4: 使用

在其他项目中,只需 pom 文件中引入我们自定义的 starter 依赖,并确保 SpecificClass 类在类路径上,Spring Boot 将自动应用这个配置。

        <dependency><groupId>com.coderjia</groupId><artifactId>spring-boot3-07-spi</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

步骤 5: 测试

首先,如果当前项目中启动类所在路径及其子路径不存在 SpecificClass 类,则从 IOC 容器中取不到 MyService

不存在SpecificClass类

当在当前项目中创建了 SpecificClass 类,则可以正常拿到 MyService bean:

存在SpecificClass类

最佳实践与注意事项

在利用 Spring Boot 的 SPI 机制开发自定义 starter 或自动配置时,有几个最佳实践和注意事项可以帮助确保项目的成功和维护性:

1. 明确条件注解

使用条件注解(如 @ConditionalOnClass@ConditionalOnBean)时,应尽量明确条件,确保你的自动配置仅在满足特定条件时才应用。这避免了配置冲突和非预期的行为,特别是在复杂的项目中。

2. 避免类路径问题

在设计自动配置时,注意类路径上可能出现的冲突。例如,如果自动配置依赖于某个库,确保这个库不会与项目中已有的库版本冲突。

3. 使用 @ConditionalOnMissingBean

在定义提供服务的 Bean 时,使用 @ConditionalOnMissingBean 注解可以确保在应用中已存在相同类型的 Bean 时,自动配置不会再创建新的 Bean,从而避免重复配置。

4. 文档和示例

为你的自定义 starter 或自动配置提供详细的文档和使用示例。这对于其他开发者来说是非常有价值的,特别是在解决依赖和配置问题时。

5. 分离自动配置和业务逻辑

将自动配置代码和业务逻辑代码分开,自动配置模块不应包含业务逻辑,它只应负责自动装配和条件判断。这样做可以提高模块的清晰度和重用性。

总结

Spring Boot 的 SPI 机制不仅强化了框架的自动配置能力,还提供了一种灵活且强大的方式来扩展和定制应用程序的行为。通过合理利用这一机制,开发者可以显著简化 Spring 应用的配置过程,加速开发和部署周期。

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

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

相关文章

(超详细讲解)实现将idea的java程序打包成exe (新版,可以在没有java的电脑下运行,即可以发给好朋友一起玩)

目录 实现打包到exe大概步骤 工具准备 1.将java程序文件打包成jar文件 2.准备好jre文件 3.使用exe4j软件打包好 4.最终打包 实现打包到exe大概步骤 1.打包需要满足的条件&#xff1a;将java文件转成jar文件的工具exe4j、 以及需要满足jdk1.8以上&#xff08;因安装exe4…

Embedding技术学习

可能很多人并没有关注Embedding技术&#xff0c;但实际上它是GPT非常重要的基础&#xff0c;准备的说&#xff0c;它是GPT模型中理解语言/语义的基础。 【解释什么是Embedding】 对于客观世界&#xff0c;人类通过各种文化产品来表达&#xff0c;比如&#xff1a;语言&#x…

如何快速提取出一个文件里面全部指定类型的文件的全部路径

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 打开工具&#xff0c;切换到第五个模块&#xff0c;文件批量复制模块&#xff08;快捷键&#xff1a;Ctrl5&#xff09; 点击右边的“搜索添加”按钮&#…

unordered系列关联式容器底层哈希结构的介绍,哈希表的模拟实现(哈希冲突的解决方法采用闭散列线性探测)

目录 前言 unordered系列关联式容器之所以处理数据的效率比较高&#xff0c;是因为底层使用了哈希结构&#xff0c;哈希结构的优点是&#xff1a;不经过任何比较&#xff0c;一次直接从表中得到要搜索的元素&#xff0c;通过某种函数(hashFunc)使元素的存储位置与它的关键码之…

mapreduce | 自定义Partition分区(案例2)

1.需求 统计每个手机号消费总金额&#xff0c;按照消费金额降序排序&#xff0c;最终联通、电信、移动分别写入不同的文件。 130、131、132&#xff08;联通&#xff09; 133&#xff08;电信&#xff09; 135、136、137、138、139 &#xff08;移动&#xff09; 手机号,消费记…

全局变量在函数中的使用:Python 编程技巧解析

在Python编程中&#xff0c;全局变量是一种在程序的多个部分中共享数据的机制。全局变量在函数中使用时&#xff0c;需要特别注意其作用域和访问方式。本文将详细讲解如何在函数中使用全局变量&#xff0c;并提供示例代码&#xff0c;帮助初学者深入理解这一概念。 基本原理 …

AI作画涉及的深度学习算法

AI作画中使用的深度学习算法多种多样&#xff0c;这些算法主要基于神经网络的结构和训练方式&#xff0c;以生成和改进艺术作品。以下是一些在AI作画中常用的深度学习算法&#xff1a; 生成对抗网络&#xff08;GANs, Generative Adversarial Networks&#xff09;&#xff1a…

Linux —— 线程

Linux —— 线程 什么是线程Linux如何实现线程Winodws如何实现线程使用一下线程pthread_create函数原型参数说明返回值 如何解决 ps -aL 查看线程线程为什么轻量 我们今天进入线程的学习&#xff1a; 什么是线程 我们先来了解一个笼统的概念&#xff1a;简单来说&#xff0c;…

计算机发展史故事【12】

芯片计算机 众所周知&#xff0c;所谓286、386、486 个人电脑等名称的起源&#xff0c;在于它们采用了英特尔公司研制的微处理器X86 系列芯片286、386 和486。然而&#xff0c;这种以数字为电脑命名的奇特现象&#xff0c;却来源于霍夫博士等人发明的世界上第一个微处理器芯片…

动态路由-链路状态路由协议ospf案例

实验拓扑和要求如图 ospf实验 1.设置各个接口地址 2.测试ar5到ar6的连通性 3.配置ospf协议&#xff0c;routerid&#xff0c;area&#xff0c; 详细的网络信息&#xff0c;等待网络收敛后&#xff0c; 查看ospf信息&#xff0c;路由表信息&#xff0c;再次测试连通性 注意区域…

防火墙技术基础篇:网络地址转换(NAT):防火墙技术的核心机制

防火墙技术基础篇&#xff1a;网络地址转换&#xff08;NAT&#xff09;&#xff1a;防火墙技术的核心机制 网络地址转换&#xff08;NAT&#xff09;是现代网络架构中不可或缺的一个组成部分&#xff0c;尤其在防火墙技术的实现中扮演着重要角色。本文旨在全面解读NAT的工作机…

AI算法-高数5.1-线性代数-向量定义、表示和向量间的关系

看线性代数这篇文章&#xff08;AI算法-高数5-线性代数1-基本概念、向量-CSDN博客&#xff09;理解有些吃力的朋友们&#xff0c;可以先学下宋浩老师的这些课程。 宋浩老师&#xff1a; 3.1 n维向量及其运算_哔哩哔哩_bilibili 3.2 向量间的线性关系&#xff08;一&#xff…

MFC编程之设计美丽的对话框

目录 写在前面&#xff1a; Part 1&#xff1a;美美的设计一下计算器的布局 1.描述文字&#xff1a; ​编辑 2.ID&#xff1a; Part 2&#xff1a;美美熟悉一下计算器的工作流程 Part 3&#xff1a;美美设计一下控件功能 1.edit control&#xff1a; 2.相关变量初始化&…

Agilent MSO9404A、Keysight MSO9404A示波器,4 GHz,4 通道,20 GSa/s

Agilent MSO9404A、Keysight MSO9404A、HP MSO9404A 示波器&#xff0c;4 GHz&#xff0c;4 通道&#xff0c;20 GSa/s Keysight MSO9404A 示波器配备 15 英寸 XGA 显示屏&#xff0c;封装深度仅为 9 英寸&#xff08;23 厘米&#xff09;&#xff0c;重量仅为 26 磅&#xff…

AI地名故事:笔岗村

笔岗村&#xff0c;实际上是由笔村和宏岗村两个古老的村落合并而成的。南宋度宗元年&#xff0c;也就是公元1265年&#xff0c;笔村开始建立。随着时间的推移&#xff0c;到了宋代后期&#xff0c;宏岗村也相继建立。这两个村落各自承载着丰富的历史和文化&#xff0c;最终在历…

铁山靠之数学建模 - Matlab入门

Matlab基础 1. Matlab界面与基本操作1.1 matlab帮助系统1.2 matlab命令1.3 matlab功能符号1.4 matlab的数据类型1.5 函数计算1.6 matlab向量1.7 matlab多项式1.8 M文件1.9 函数文件1.10 matlab的程序结构1.11 echo、warning和error函数1.12 交互输入1.13 程序调试1.14 设置断点…

‌‍‬⁣⁡​⁤⁢​⁢⁡⁣‬‍‌​​‬ ​‍⁤‬ ‬⁡⁡⁡‍‌‬⁡⁡⁢‬⁤⁢⁢⁤​‍‌​​‬ ​⁣‌绘唐3一键追爆款反推软件哪家好

‌‍‬⁣⁡​⁤⁢​⁢⁡⁣‬‍‌​​‬ ​‍⁤‬ ‬⁡⁡⁡‍‌‬⁡⁡⁢‬⁤⁢⁢⁤​‍‌​​‬ ​⁣‌绘唐3一键追爆款反推软件哪家好 支持单镜精绘&#xff0c;可以根据故事情节进行单镜头绘图调整&#xff0c;并支持对SD各类模型的自定义调整。 支持一键完成图文视频合成&am…

Windows11“重置此电脑”后,Edge浏览器在微软应用商店显示“已安装”,但是开始菜单搜索不到的解决办法

Windows11“重置此电脑”后&#xff0c;Edge浏览器在微软应用商店显示“已安装”&#xff0c;但是开始菜单搜索不到的解决办法 为什么重新使用Edge&#xff1f;问题描述不该更新可用更新问过AI&#xff08;通义千问&#xff09;&#xff0c;并且AI提供方法全都无效。现象 操作步…

国产分布式数据库高可用故障检测实现

在分布式数据库架构下&#xff0c;当数据库节点异常时&#xff0c;数据库管理组件能够自动感知到异常并触发节点隔离或者自动切换&#xff0c;是数据库高可用容灾的基本能力。在节点服务器异常、网络异常或进程异常等场景下&#xff0c;各数据库产品本身已经具备了可靠的检测能…

为什么说气膜是环保建筑呢—轻空间

气膜建筑&#xff0c;作为一种绿色环保建筑&#xff0c;其环保特性主要体现在以下几个方面&#xff1a; 1. 节约水资源&#xff1a; 气膜建筑在施工和运行过程中不需要大量水资源&#xff0c;与传统建筑相比&#xff0c;可以每年节约数万吨水资源。这种节约不仅有利于缓解水资源…