@(Java)[SPI]

Service Provider Interface

API的一种设计方法,一般用于一些服务提供给第三方实现或者扩展,可以增强框架的扩展或者替换一些组件。

结构

  • Service

    服务,可以理解为一系列的接口
  • Provider

    Service的实现,一般实现指定的Service接口或者继承指定的类
  • Provider registration and access

    用于注册定义的Provider以及获取指定的Provider实现。

JDBC中的SPI

由于数据库的多种多样,可以向外提供一组接口(即Service),由数据库厂商来实现对应的接口(即Provider),在使用的时候通过配置加载进来,例如,在JDBC中,其中驱动部分是通过Driver接口以及DriverManager来实现的,如下:

// 定义一些必要的接口(Service)
public interface Driver {
Connection connect(String url, java.util.Properties info)
throws SQLException; ...
} // 向外提供注册以及获取实现的接口(Provider register and access)
public class DriverManager {
public static synchronized void registerDriver(java.sql.Driver driver) {
...
}
}

对于MySQL来说:

// 驱动实现(Provider)
package com.mysql.jdbc;
public class Driver extends NonRegisteringDriver implements java.sql.Driver { static {
try {
// 在类加载的时候就进行注册
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
...
}

后续则可以和普通API一样照常使用,极大的提高了扩展性。

参考

Wiki:

https://en.wikipedia.org/wiki/Service_provider_interface

Book:

Effective Java 2nd, item 1

最新文章

  1. 二叉排序树(BST)创建,删除,查找操作
  2. Python 实现隐藏文件夹、文件操作
  3. chrome developer tool 调试技巧
  4. BI案例:某公司BI系统的九大主题分析
  5. FIR滤波器(1)- 基础知识
  6. focus on these tools
  7. MYSQL同步--主从同步问题集锦
  8. 删除 vim 命令
  9. shell脚本学习-练习写一个脚本2
  10. MySQL如何使用索引
  11. Netty源码分析(一):Netty总览
  12. Randomized Online PCA Algorithms with Regret Bounds that are Logarithmic in the Dimension
  13. CentOS7利用systemctl添加自定义系统服务
  14. 4.html基础标签:表单
  15. 脚手架搭建vue框架
  16. 你不知道的JavasScript上篇·第五章·原型·下
  17. python之Web服务器案例
  18. codevs 1230 元素查找
  19. 用hashlib生成动态token
  20. 分享一下Ubuntu好用的源

热门文章

  1. 记录一次Quartz2D学习(六)
  2. MVC 后台管理框架 FineUIMvc 在线示例
  3. ASP.NET MVC Controllers and Actions
  4. Python来做应用题及思路
  5. auto_clipboard
  6. nginx服务傻瓜搭建
  7. half extents
  8. mysql max_allowed_packet 设置过小导致记录写入失败
  9. [LeetCode] Path Sum 二叉树的路径和
  10. Java反射机制