Java SPI机制
1. 定义
SPI(Service Provider Interface):是JDK内置的一种服务提供发现机制,用来被第三方实现或者扩展的API,可以启用框架扩展和替换组件,实际上是基于接口的编程+策略模式+配置文件组合实现的动态加载机制;
API(Application Programming Interface):是实现方
制定接口并完成对接口的实现,调用方
仅仅进行接口调用,且无权选择不同实现。
2. 特点
A. 不需要改动源码就可以实现扩展,解耦;
B. 不能按需加载,需要遍历所有的实现,并实例化,然后在循环中才能找到我们需要的实现;
C. 多个并发多线程使用 ServiceLoader 类的实例是不安全的。
3. 使用规约
A. 在classpath下面新建META-INF/services目录;
B. 在目录下创建一个以"接口全限定名"为命名的文件,内容为实现类的全限定名,以分行符分隔,且为UTF-8编码;
C. SPI的实现类必须携带一个不带参数的构造方法。
D. 主程序通过扫描META-INF/services目录下的配置文件找到实现类的全限定名,把类加载到JVM;
比如:ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
4. 应用场景及实例
A. 调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略;
B. JDBC接口定义:首先在java中定义了接口java.sql.Driver
,并没有具体的实现,具体的实现都是由不同厂商来提供的;
C. 日志接口实现类加载:SLF4J加载不同提供商的日志实现类;
D. Spring中大量使用了SPI:对servlet3.0规范对ServletContainerInitializer的实现、自动类型转换Type Conversion SPI(Converter SPI、Formatter SPI)等。
可参考:Java常用机制 - SPI机制
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗