news 2026/5/9 9:31:48

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/5/1 10:04:33

我的《Vue.js前端框架技术》课程深度学习之旅

当我编写的第一个Vue组件在浏览器中成功渲染出“Hello Vue!”&#xff0c;那种从零到一的突破感瞬间点燃了我对前端开发的热情。 作为一名前端技术爱好者&#xff0c;我深知掌握一门现代框架不仅需要理解语法&#xff0c;更需要建立完整的知识体系。在这门《Vue.js前端框架技术…

作者头像 李华
网站建设 2026/5/8 19:02:29

C++共享内存小白入门指南

什么是共享内存&#xff1f; 想象一下&#xff0c;你和你的室友共用一个冰箱。你们都可以往里面放东西&#xff0c;也可以从里面拿东西&#xff0c;这就是共享内存的基本概念&#xff01;在C中&#xff0c;共享内存是一种让不同进程&#xff08;可以理解为不同的程序&#xff0…

作者头像 李华
网站建设 2026/5/2 15:48:58

仓库 Reel ID

“仓库 Reel ID” 是在仓储管理、电子元器件、SMT&#xff08;表面贴装技术&#xff09;等行业中常见的一个术语&#xff0c;尤其在 高价值、小体积、卷带包装物料的精细化管理场景 中广泛使用。&#x1f4cc; 一、“Reel ID” 是什么&#xff1f;Reel ID&#xff08;卷盘编号&…

作者头像 李华
网站建设 2026/5/2 19:27:38

从零搭建智能体:用数眼智能构建 AI 智能体 Agent 实战

一、为什么选择数眼智能构建 AI Agent&#xff1f;—— 解决联网型 Agent 的核心痛点 传统 AI 模型&#xff08;如 ChatGPT&#xff09;仅能被动生成回答&#xff0c;普通 AI Agent 虽能调用工具&#xff0c;但在实时联网场景中常踩坑&#xff1a;信息过期&#xff08;用半年前…

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

积分理财骗局终落幕 监管导向解读为新消费划清合规红线

新消费浪潮下&#xff0c;“消费积分”本是提升用户粘性的良性工具&#xff0c;却被部分不法企业异化为圈钱利器。此前备受关注的“翰林金业”非法集资、传销案&#xff0c;便是新消费领域违规经营的典型缩影&#xff0c;其覆灭再次为行业敲响合规警钟。 “翰林金业”以“绿色消…

作者头像 李华
网站建设 2026/5/1 10:03:23

搭建禅道环境作为练习UI和接口自动化测试对象

1 目的 做UI和接口自动化练习时&#xff0c;有时候找不到合适的对象&#xff0c;我们可使用禅道来联系&#xff1b; 因为禅道有开源版&#xff0c;可以二次开发&#xff0c;并有详细的API手册&#xff1b; 本文的目的是整理并分享&#xff0c;使用禅道来作为测试对象的过程&a…

作者头像 李华