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机制

 

posted @   如幻行云  阅读(153)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示