Service Provider Interface

@(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

原文地址:https://www.cnblogs.com/jabnih/p/5682792.html