news 2026/4/18 5:16:27

SPI注入

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SPI注入

简单来说:

Api,你调用框架

spi,框架调用你

一、先记住这四个角色

可以先记住这四个角色:

  1. Java SPI:JDK 级插件发现(最原始)
  2. Spring Boot SPI:框架级插件发现(带生命周期)
  3. 自动装配:框架替你做“默认决策”
  4. 显式装配:你明确告诉 Spring “我要什么”

后面所有细节,都是这四件事的不同组合。


二、Java SPI 注入(JDK 原生)

1️⃣ Java SPI 是什么角色?

一句话:

Java SPI 只负责“发现实现”,不负责“何时加载、是否加载、如何使用”。


2️⃣ Java SPI 的组成

(1)接口(扩展点)
public interface PayService { void pay(); }
(2)实现类
public class AliPayService implements PayService { }
(3)配置方式(唯一)

📍META-INF/services/接口全限定名

META-INF/services/com.example.PayService

内容:

com.example.AliPayService

3️⃣ 谁来“注入”?——必须你自己写

ServiceLoader<PayService> loader = ServiceLoader.load(PayService.class);

这是 Java SPI 的生效开关。

没有这行代码:

  • 不扫描
  • 不实例化
  • 不注入

4️⃣ Java SPI 的本质特征

维度

Java SPI

配置是否自动生效

❌ 否

是否需要触发代码

✅ 必须

生命周期

❌ 无

条件装配

❌ 无

使用场景

基础库、JDK 扩展

关键词:拉模型(Pull)

三、Spring Boot SPI 注入(框架级)

Spring SPI 的本质是:

Spring 在启动过程中,主动帮你调用“ServiceLoader 类似的逻辑”。

你只需要“登记”,不用“触发”。

四、Spring Boot SPI 的几种主要形式(按层级)

第一类:自动配置 SPI(最重要)

1️⃣ 配置方式(新一代,推荐)

📍META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

com.example.MyAutoConfiguration
2️⃣ Java 类
@AutoConfiguration public class MyAutoConfiguration { @Bean public MyService myService() { ... } }
3️⃣ 特点

特性

说明

是否自动生效

是否进 IoC

是否可条件控制

是否需 @Import

面向对象

starter / 框架作者


第二类:传统 Spring SPI(仍在使用)

📍META-INF/spring.factories

org.springframework.context.ApplicationListener=\ com.example.MyListener

常见接口:

  • ApplicationListener
  • ApplicationContextInitializer
  • EnvironmentPostProcessor

特点:

  • 启动非常早
  • 多数不进入 IoC
  • 仍属于框架级扩展机制

第三类:IoC 内部扩展(不是 SPI,但常混)

  • BeanFactoryPostProcessor
  • BeanPostProcessor
  • ImportSelector

这些是:

容器内部扩展,而不是 classpath 级插件机制

五、什么是“自动装配”?

一句话定义(非常重要)

Spring Boot 根据环境和条件,自动决定“要不要装某些 Bean”。

自动装配 = 自动配置类 + 条件判断。


自动装配的典型特征

  • 配置类来自 SPI(imports / spring.factories)
  • 几乎都有@Conditional
  • 默认生效,但允许你覆盖

自动装配 ≠ 自动扫描

自动扫描是:

@ComponentScan

自动装配是:

@ConditionalOnClass @ConditionalOnMissingBean

决策权在框架,不在你。


六、什么是“显式装配”?

一句话定义

开发者明确告诉 Spring:这个 Bean / 配置我要。


常见显式装配方式

方式

示例

@Bean

手动定义

@Configuration

明确配置

@Import

主动引入

XML

老派但明确


显式装配的哲学

  • 开发者掌控
  • 行为可预测
  • 不“猜”

七、自动装配 vs 显式装配(对照表)

维度

自动装配

显式装配

谁做决定

Spring Boot

开发者

是否默认生效

是否可覆盖

本来就是你写的

典型注解

@AutoConfiguration

@Configuration

适用场景

通用能力

业务逻辑

八、工程级总结

- Java SPI:实现发现,但使用者负责一切

META-INF/services/com.example.PayService
这是java的spi注入,需要自己写ServiceLoader

- Spring Boot SPI:框架级实现发现 + 生命周期管理

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
这是springBoot的新型自动装配方式

META-INF/spring.factories

传统 Spring SPI(仍在使用)

- 自动装配:框架提供默认能力,用户可覆盖

- 显式装配:业务代码直接做决定

选择哪种方式,本质取决于:
决策权应该在框架,还是在业务代码。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 16:24:27

ARM 汇编指令:MOV

ARM 汇编指令&#xff1a;MOV 本文来自于我关于 ARM 汇编指令系列文章。欢迎阅读、点评与交流~ 1、ARM 汇编指令&#xff1a;MOV 2、ARM 汇编指令&#xff1a;LDR 3、ARM 汇编指令&#xff1a;STR 4、ARM 汇编指令&#xff1a;MRS 和 MSR 5、ARM 汇编指令&#xff1a;ORRS 在 A…

作者头像 李华
网站建设 2026/4/16 1:50:07

第 8 篇 目标检测(下):YOLO与SSD的“一步到位”哲学

《人工智能AI之计算机视觉:从像素到智能》 模块二:核心感知(上)——2D世界的精细化理解 朋友们好。 在上一篇里,我们聊了R-CNN家族。那是一群像严谨的考古学家一样的算法,讲究“先勘探(找候选区),再鉴定(分类和微调)”。听起来特别靠谱,对吧?这种“两步走”的逻…

作者头像 李华
网站建设 2026/4/14 17:26:26

基于spark的新闻文本分类系统(源码+论文+部署+安装)

感兴趣的可以先收藏起来&#xff0c;还有在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望可以帮到大家。一、程序背景在互联网扩张、智能设备普及与短视频浪潮的推动下&#xff0c;新闻传播数字化趋势显著&#…

作者头像 李华
网站建设 2026/4/13 9:49:53

java基础-Map接口

在Java中&#xff0c;Map 是一个非常重要的接口&#xff0c;它表示键值对&#xff08;Key-Value&#xff09;的映射集合。Map 不允许重复的键&#xff0c;每个键最多只能映射到一个值。Map 接口的主要特点键唯一性&#xff1a;不允许重复的键键值对存储&#xff1a;每个元素包含…

作者头像 李华
网站建设 2026/4/18 5:14:00

Triton-Ascend编译链路深度解构-从DSL到NPU二进制的艺术

目录 摘要 &#x1f9e0; 一、编译链路&#xff1a;被90%开发者忽视的性能密码 ⚙️ 二、五层编译栈&#xff1a;昇腾NPU指令生成的完整旅程 &#x1f539; 2.1 全局架构视图 &#x1f539; 2.2 第一层&#xff1a;Triton DSL —— 高级抽象的起点 &#x1f539; 2.3 第二…

作者头像 李华
网站建设 2026/4/18 5:13:58

【每天学习一点算法 2025/12/18】对称二叉树

每天学习一点算法 2025/12/18 题目&#xff1a;对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 老规矩先来递归&#xff0c; 检查二叉树是否轴对称&#xff0c;我们是不是得比较根节点下面得两个子树是否是轴对称&#xff0c;那么我们只需要递归比较…

作者头像 李华