Java的SPI机制

SPI的概念

英文全称为Service Provider Interface

是JDK内置的一种服务提供发现机制

SPI机制可以在不修改jar包或框架的情况下,为API接口提供新的实现

SPI机制的约定

  • 具体做法
    1. META-INF/services/目录中创建以接口全限定名命名的文件该文件内容为API具体实现类的全限定名,例如:
      接口为ObjectSerializer

      文件内的内容如下:
       com.blueskykong.javaspi.serializer.KryoSerializer
       com.blueskykong.javaspi.serializer.JavaSerializer
      
    2. 使用ServiceLoader类动态加载META-INF中的实现类
       ServiceLoader<ObjectSerializer> objectSerializers = ServiceLoader.load(ObjectSerializer.class)
       Iterator<ObjectSerializer> objectSerializerIterator= objectSerializers.iterator();
       // 之后就可以通过objectSerializerIterator.next()按顺序获取实现类
      
    3. 如果SPI的实现类为jar,则需要放在当前程序classpath
    4. API具体实现类必须有一个不带参数的构造方法

SPI用途

在JDBC4.0之前,连接数据库的时候,通常会用Class.forName("com.mysql.jdbc.Driver")这句先加载数据库相关的驱动,然后再进行获取连接等的操作。而JDBC4.0之后不需要Class.forName来加载驱动,直接获取连接即可,这里使用了Java的SPI扩展机制来实现

参考

Java SPI机制详解
Java的SPI机制与简单的示例

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以...
    男人三饼阅读 276评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 作者:成 富, 软件工程师, IBM 中国软件开发中心 类加载器(class loader)是 Java™中的一个...
    Android技术研究阅读 3,912评论 0 74
  • 一个人 发呆… 一个人 等候… 一个人 离开… 听一首歌 会哭好久 想一件事 会丢了魂 做一次梦 不知所措 我独自...
    喵喵哒哒哒阅读 185评论 0 3