news 2026/8/8 13:21:34

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/8/8 5:24:53

GEE训练教程:2024年基于GEMI指数的植被变化全解析

简介 巴基斯坦拉合尔市2024年的植被状况,主要特点: GEMI指数特点: 全球环境监测指数(Global Environmental Monitoring Index, GEMI)是一种基于卫星遥感的植被指数,于1996年由Pinty和Verstraete提出。它是专门为全球尺度的植被监测而设计的,特别强调对大气影响的抵抗能…

作者头像 李华
网站建设 2026/8/7 12:18:03

算法练习5--数组:螺旋矩阵

力扣59#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {int** nums (int**)malloc(n * sizeof(int*));for (int i 0; i < n; i){nums[i] (int*)malloc(n …

作者头像 李华
网站建设 2026/8/8 13:44:36

技术突破:噬菌体文库制备如何为猪腹泻病毒检测注入新动力?

在生猪养殖领域&#xff0c;仔猪腹泻一直是困扰业界的难题&#xff0c;其背后主要的病毒元凶——猪传染性胃肠炎病毒&#xff08;TGEV&#xff09;和猪德尔塔冠状病毒&#xff08;PDCoV&#xff09;&#xff0c;因其变异快、混合感染常见&#xff0c;给精准诊断带来了巨大挑战。…

作者头像 李华
网站建设 2026/8/8 7:43:42

微算法科技(NASDAQ MLGO)使用多线程技术提升区块链共识算法的性能

在区块链技术从概念验证走向大规模商业应用的进程中&#xff0c;共识算法的性能瓶颈始终是制约其发展的核心挑战。传统区块链网络&#xff08;如比特币、以太坊&#xff09;采用的Proof of Work&#xff08;PoW&#xff09;共识机制因算力竞争导致低效与高能耗&#xff0c;而改…

作者头像 李华
网站建设 2026/8/8 0:30:34

零基础入门学网络安全(详细),看这篇就够了

目录 1.什么是网络安全 1.1 网络安全的定义&#xff1a;1.2 信息系统&#xff08;Information System&#xff09;1.3 信息系统安全三要素&#xff08;CIA&#xff09;1.4 网络空间安全1.5 国家网络空间安全战略1.6 网络空间关注点1.7 网络空间安全管理流程 2.网络安全术语3.…

作者头像 李华