首页 > 技术文章 > Java SPI机制

ruhuanxingyun 2020-08-05 08:33 原文

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

 

推荐阅读