news 2026/7/14 11:18:17

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/7/13 22:49:41

多模态媒体发布技术架构解析:Infoseek 如何支撑科技舆情的极速响应?

一、行业背景&#xff1a;科技舆情对媒体发布的技术诉求2025 年 12 月&#xff0c;字节跳动 “豆包手机” 因监管约谈谣言引发舆情风暴&#xff0c;涉事方需在 24 小时内通过多渠道发布澄清声明、技术解读、合规报告&#xff0c;传统媒体发布的 “人工对接 格式适配 效果盲测…

作者头像 李华
网站建设 2026/7/13 10:47:26

Java求职者面试:面试官与水货程序员的搞笑对决

Java求职者面试&#xff1a;面试官与水货程序员的搞笑对决 场景背景 在这场极具挑战的面试中&#xff0c;严肃的面试官和搞笑的水货程序员谢飞机相遇。谢飞机凭借他的幽默感和简短的回答&#xff0c;与面试官进行了三轮提问&#xff0c;内容涉及Java技术栈和实际业务场景。在这…

作者头像 李华
网站建设 2026/7/13 22:48:32

Linux命令行和命令行管理文件

Linux 命令行控制台Console&#xff0c;也就是控制台&#xff0c;也称为终端&#xff0c;提供命令行输入数据和展示命令行输出数据。物理控制台&#xff0c;用于与系统交互的硬件接口。虚拟控制台&#xff0c; 名称为tty1--tty6&#xff0c;通过ctrl alt F1...F6切换。tty1是…

作者头像 李华
网站建设 2026/7/13 22:27:39

OSPF综合实验2

一 实验拓扑二 实验要求1&#xff0c;R5为ISP&#xff0c;其上只能配置IP地址&#xff1b;R4作为企业边界路由器&#xff0c;出口公网地址需要通过PPP协议获取&#xff0c;并进行chap认证2&#xff0c;整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;3&#xff0c;所有设备均…

作者头像 李华
网站建设 2026/7/14 5:29:24

2026年备战浙大全日制 iMBA 复试必须要抓住的三大关键机会!

随着12月20日全国MBA联考初试结束&#xff0c;多数考生第一时间都完成了自己的初试估分工作。具体多少分数可以进入复试&#xff1f;杭州达立易考教育认为&#xff1a;如果初试分数估在150 分上下&#xff0c;就可提前启动浙大全日制 iMBA 项目的复试备考&#xff0c;因为从这两…

作者头像 李华