JAVA中SPI机制

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

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

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

应用场景sql

SPI扩展机制应用场景有不少,好比Common-Logging,JDBC,Dubbo等等。apache

SPI流程:安全

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

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

  3. 开发者使用post

好比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

相关文章
相关标签/搜索