news 2026/4/16 0:04:36

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/13 21:17:35

别只学项目管理技巧了!顶级高手都在用的4大“心法”

在管理实践中&#xff0c;技术手段与规章制度固然重要&#xff0c;但真正决定管理境界的&#xff0c;往往是深植于管理者内心的思维范式。优秀的管理者&#xff0c;往往超越了具体方法的层面&#xff0c;在哲学思维的指引下&#xff0c;洞察本质、驾驭复杂、引领变革。 一、见树…

作者头像 李华
网站建设 2026/4/2 8:59:03

集团委外采购订单

“集团委外采购订单” 是大型企业集团在集中化、多组织协同管理背景下常见的一种采购业务模式。下面我们从 定义、适用场景、流程逻辑、系统实现要点 等方面进行全面解析&#xff0c;帮助你理解其含义和应用。&#x1f4cc; 一、什么是“集团委外采购订单”&#xff1f;集团委外…

作者头像 李华
网站建设 2026/4/15 17:16:30

免费领!牛津树1-2级全套资源 幼儿英语启蒙必备(附音频+点读包)

各位宝妈们&#xff0c;是不是跟我一样&#xff0c;想给娃做英语启蒙&#xff0c;却被五花八门的资料搞得头大&#xff1f;选来选去还是觉得牛津树靠谱&#xff0c;但找完整资源真的太费劲儿了——要么只有绘本没音频&#xff0c;要么有点读包却缺练习册&#xff0c;凑齐一套得…

作者头像 李华
网站建设 2026/4/15 4:28:05

算法总论:为什么高手思考用“模型”,而非“感觉”?

《元能力系统:重塑你的内在架构》 第三模块:【算法篇】—— 编码高效能的心智程序 第10/21篇 朋友你好。 在前面的旅程中,我们唤醒了“觉察者”(觉醒篇),并为你搭建了由认知、动机、情感、学习四大支柱构成的“内在生态”(架构篇)。 现在,你的内在系统已经有了光照、水…

作者头像 李华
网站建设 2026/4/8 23:28:33

工艺过程镜像系统:制造过程的数字孪生

在工业制造迈向智能化、数字化的浪潮中&#xff0c;精准掌控工艺过程、实时保障产品质量、高效管理生产任务成为企业提升竞争力的关键。蕴硕物联凭借深厚的技术积累与创新精神&#xff0c;精心打造的“工艺过程镜像系统”&#xff0c;为工业制造领域带来了一场变革性的突破。01…

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

小程序计算机毕设之基于springboot+微信小程序的影院售票系统设计与实现基于微信小程序的影院售票系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华