重学SpringBoot3-SPI机制

news2024/9/23 3:30:47

更多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.DataSourceAutoConfiguration

org.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
    @ConditionalOnMissingBean
    public MyService MyService() {
        return new MyServiceImpl();
    }
}

MyService 类简单实现:

public class MyServiceImpl implements MyService {
    @Override
    public 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.coloradmin.cn/o/1645445.html

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

相关文章

【1小时掌握速通深度学习面试6】图神经网络-下

目录 23. GraphSage 24.简述图神经网络的推理机制在其他领域中的应用 与传统NN的区别&#xff08;GNN优点&#xff09; 23. GraphSage GraphSage出现之前的图网络方法需要图中所有的顶点在训练embedding的时候都出现&#xff0c;这些的方法本质上是transductive&#xff0c…

我独自升级:崛起怎么下载 我独自升级游戏下载教程分享

定于5月8日全球揭幕的《我独自升级崛起》——一款扣人心弦的动作RPG巨制&#xff0c;灵感采撷于同名动画及网络漫画的热潮&#xff0c;誓将引领满怀热忱的玩家步入一场交织着深邃探索和宏大规模的奇妙冒险。该游戏立足于一个独树一帜的网络武侠宇宙&#xff0c;细腻刻画了一个凡…

基于Springboot的民航网上订票系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的民航网上订票系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

【Osek网络管理测试】[TG3_TC1]Limphome复位_NM报文

&#x1f64b;‍♂️ 【Osek网络管理测试】系列&#x1f481;‍♂️点击跳转 文章目录 1.环境搭建2.测试目的3.测试步骤4.预期结果5.测试结果 1.环境搭建 硬件&#xff1a;VN1630 软件&#xff1a;CANoe 2.测试目的 验证DUT从LimpHome状态转换到Reset状态是否满足NM标准的…

【电商-虾皮】

电商-虾皮 ■ 人口分布■ 市场■ 欧美市场■ 东南亚市场 ■ ■ 人口分布 ■ 市场 ■ 欧美市场 亚马逊 ■ 东南亚市场 shopee ■

推荐网站(4)以图片找动漫,二次元福利!!!

有的时候只有图片不知道&#xff0c;这是什么动漫&#xff0c;在多少集出现过那么&#xff0c;这个网站觉得是你的福音 我们去b站随便找一个动漫试试看&#xff0c;截图保存 然后进入网站&#xff0c;点击文件按钮上传照片 可以看到精准搜出来了动漫&#xff0c;更为重要的是连…

深入理解回溯算法

大家好&#xff0c;我是 方圆&#xff0c;本篇我们来讲回溯。回溯相当于穷举搜索&#xff0c;它会尝试各种可能的情况直到找到一个满足约束条件的解&#xff0c;寻找解的手段一般通过 DFS 实现&#xff0c;是一个 增量构造答案 的过程。回溯法适用于解决能够将原问题拆分成子问…

ABAP开发(5)字符串操作

文章目录 1、CONCATENATE2、SPLIT3、SEARCH4、REPLACE 1、CONCATENATE 使用关键字CONCATENATE可以将多个字符串进行连接&#xff0c;也可以在连接的过程中添加分隔符。 2、SPLIT 3、SEARCH 4、REPLACE

wordpress外贸建站公司歪建站新版网站上线

wordpress外贸建站公司 歪猫建站 歪猫WordPress外贸建站&#xff0c;专业从事WordPress多语言外贸小语种网站建设与外贸网站海个推广、Google SEO搜索引擎优化等服务。 https://www.waimaoyes.com/dongguan

segformer部分错误

亲测有用 1、TypeError: FormatCode() got an unexpected keyword argument ‘verify‘ mmcv中出现TypeError: FormatCode() got an unexpected keyword argument ‘verify‘-CSDN博客 pip install yapf0.40.0 2、“EncoderDecoder: ‘mit_b1 is not in the backbone regist…

10 华三vlan技术介绍

AI 解析 -Kimi-ai Kimi.ai - 帮你看更大的世界 (moonshot.cn) 虚拟局域网&#xff08;VLAN&#xff09;技术是一种在物理网络基础上创建多个逻辑网络的技术。它允许网络管理员将一个物理网络分割成多个虚拟的局域网&#xff0c;这些局域网在逻辑上是隔离的&#xff0c;但实际…

SOL链DApp智能合约代币质押挖矿分红系统开发

随着区块链技术的不断发展和普及&#xff0c;越来越多的项目开始探索基于区块链的去中心化应用&#xff08;DApp&#xff09;。Solana&#xff08;SOL&#xff09;作为一条高性能、低成本的区块链网络&#xff0c;吸引了众多开发者和项目&#xff0c;其中包括了各种类型的DApp&…

昂科烧录器支持O2Micro凹凸科技的电池组管理IC OZ7708

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中O2Micro凹凸科技的电池组管理IC OZ7708已经被昂科的通用烧录平台AP8000所支持。 OZ7708是一款高度集成、低成本的电池组管理IC&#xff0c;适用于5~8s Li-Ion/Polymer电池组&a…

为什么要学Python?学Python有什么用?

为什么要学Python&#xff1f;学Python有什么用&#xff1f; 在当今的数字化时代&#xff0c;编程已成为一项宝贵的技能。Python&#xff0c;作为一种流行的编程语言&#xff0c;因其易于学习和强大的功能而受到全球开发者的青睐。本文将探讨学习Python的原因和它的实际应用&am…

武汉星起航:跨境电商领域国际竞争力卓越,引领行业再上新台阶

在全球化浪潮的推动下&#xff0c;跨境电商行业日益成为各国经济交流与合作的重要桥梁。武汉星起航电子商务有限公司&#xff0c;作为跨境电商领域的佼佼者&#xff0c;凭借其深厚的行业经验和前瞻性的战略视野&#xff0c;在国际市场上展现出强大的竞争力&#xff0c;为行业的…

【SpringMVC 】什么是SpringMVC(二)?如何整合ssm框架以及使用mybatisPlus?

文章目录 SpringMVC第三章1、ssm整合1、基本步骤1-3步4-5步6步7步8-12步13步14-15步2、添加数据3、删除数据4、配置事务5、修改数据2、pageHelpe分页1、基本步骤第四章1、mybatisPlus1、基本步骤1-45-7892、基本方法的使用查询2、新ssm项目1、基本步骤1-5678-910-111213-15Spri…

C++11,{}初始化,initializer_list,decltype,右值引用,类和对象的补充

c98是C标准委员会成立第一年的C标准&#xff0c;C的第一次更新是C03&#xff0c;但由于C03基本上是对C98缺陷的修正&#xff0c;所以一般把C98与C03合并起来&#xff0c;叫做C98/03&#xff1b; 后来原本C委员会更新的速度预计是5年更新一次&#xff0c;但由于C标准委员会的进…

2×24.5W、内置 DSP、低失真、高信噪比、I2S 输入 D 类音频功率放大器,完美替换TPA5805,晶豪,致盛,

ANT3825 是一款高集成度、高效率的双通道数字 输入功放。供电电压范围在 5V&#xff5e;18V&#xff0c;数字接口 电源支持 3.3V 或 1.8V。双通道 BTL 模式下输出 功率可以到 224.5W(4Ω&#xff0c;16V&#xff0c;THDN1%)&#xff0c; 单通道 PBTL 模式下可以输出 37W&#x…

软件测试产品交付包括哪些内容?

软件测试产品交付通常会包括以下内容: 1. 测试计划:详细的测试方案、测试范围、测试资源与时间安排等内容。 2. 测试用例:包括功能测试用例、性能测试用例、安全测试用例等各类测试用例。 3. 测试环境:包括硬件环境、软件环境、网络环境、数据环境等测试所需要的各种环境。 4. …

Chrome提示(已屏蔽:mixed-content)

这是提示信息&#xff0c;它的含义就是你在https的站点里面去请求了非https的资源&#xff0c;(我这里就是这个情况&#xff0c;web页是https的&#xff0c;但是接口是http的)&#xff0c;所以就会出现这个问题&#xff0c;解决办法也很简单&#xff0c;给它套上证书就行了