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