JAVA中SPI机制

Posted quyf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA中SPI机制相关的知识,希望对你有一定的参考价值。

之前研究dubbo的时候就很好奇,里面各种扩展机制,期间也看过很多关于SPI的机制,今日有缘再度看到有文章总结,故记录一下,

首先了解一下 JAVA中SPI简单的用法

可参考这篇文章,https://mp.weixin.qq.com/s/vpy5DJ-hhn0iOyp747oL5A

应用场景

SPI扩展机制应用场景有很多,比如Common-Logging,JDBC,Dubbo等等。

SPI流程:

  1. 有关组织和公式定义接口标准 

  2. 第三方提供具体实现: 实现具体方法, 配置 META-INF/services/$interface_name 文件 

  3. 开发者使用

比如JDBC场景下:

  • 首先在Java中定义了接口java.sql.Driver,并没有具体的实现,具体的实现都是由不同厂商提供。

  • mysql的jar包mysql-connector-java-6.0.6.jar中,可以找到META-INF/services目录,该目录下会有一个名字为java.sql.Driver的文件,文件内容是com.mysql.cj.jdbc.Driver,这里面的内容就是针对Java中定义的接口的实现。

  • 同样在PostgreSQL的jar包PostgreSQL-42.0.0.jar中,也可以找到同样的配置文件,文件内容是org.postgresql.Driver,这是PostgreSQL对Java的java.sql.Driver的实现。

不足

1.不能按需加载,需要遍历所有的实现,并实例化,然后在循环中才能找到我们需要的实现。如果不想用某些实现类,或者某些类实例化很耗时,它也被载入并实例化了,这就造成了浪费。

2.获取某个实现类的方式不够灵活,只能通过 Iterator 形式获取,不能根据某个参数来获取对应的实现类。

3.多个并发多线程使用 ServiceLoader 类的实例是不安全的。

如何规避,

针对以上的不足点,我们在SPI机制选择时,可以考虑使用dubbo实现的SPI机制。

 

具体参考: 

http://dubbo.apache.org/zh-cn/blog/introduction-to-dubbo-spi.html

 

以上是关于JAVA中SPI机制的主要内容,如果未能解决你的问题,请参考以下文章

杂谈java SPI机制

Java基础之SPI机制

Java是如何实现自己的SPI机制的? JDK源码

Java -- JDK中SPI机制

Java SPI 机制详解

高级开发必须理解的Java中SPI机制