一、当面试官说"SPI都不了解?"时,他在问什么?
最近在面试中被问到一个问题: “Java的SPI机制了解吗?用过哪些场景?” 我支支吾吾地回答了JDBC的DriverManager,结果被面试官一句"这很难让你通过啊"直接暴击。痛定思痛,我决定彻底搞懂这个看似简单却暗藏玄机的问题。
面试官的真实意图:
- 考察对Java生态底层扩展机制的理解深度
- 检验是否具备框架设计中的"解耦思维"
- 通过SPI延伸考察类加载机制、双亲委派等知识点
二、SPI是什么?30秒说清核心概念
SPI(Service Provider Interface) 是Java提供的一套服务发现机制,核心目标是解耦接口与实现。
举个栗子🌰:
- 接口方(如JDBC):定义标准接口(如
java.sql.Driver
) - 实现方(如MySQL):提供具体实现类(如
com.mysql.cj.jdbc.Driver
) - 调用方(如你的代码):通过
ServiceLoader
动态加载实现类
和API的区别(高频考点❗)
- API(Application Programming Interface) :调用方直接依赖实现(强绑定)
- SPI(Service Provider Interface) :调用方依赖接口,实现方动态注入(松耦合)
三、SPI底层原理:ServiceLoader如何玩转"插件化"?
1. 配置文件藏在哪里?
实现类的全限定名必须写在META-INF/services/[接口全限定名]
文件中,例如:
# 文件:META-INF/services/javax