zoukankan      html  css  js  c++  java
  • 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

    人生在勤,不索何获,坚持自有收获
  • 相关阅读:
    iOS -一些常用的方法
    handoff了解
    UIlabel
    扩展运行机制
    github -- fork提交项目
    iOS
    AppDelegate解析
    KVC
    KVO
    xcode升级后, 插件失效修复
  • 原文地址:https://www.cnblogs.com/quyf/p/11531531.html
Copyright © 2011-2022 走看看