背景
Java 中区分 Api 和 Spi,通俗的讲:Api 和 Spi 都是相对的概念,他们的差别只在语义上,Api 直接被应用开发人员使用,Spi 被框架扩张人员使用,详细内容可以看: 【Java基础】java详解SPI和API
Java类库中的实例
代码
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "123456");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from Users");
说明
java.sql.Driver 是 Spi,com.mysql.jdbc.Driver 是 Spi 实现,其它的都是 Api。
如何实现这种结构?
代码
public class Program {
public static void main(String[] args) throws InstantiationException,
IllegalAccessException, ClassNotFoundException {
Class.forName("SpiA");
Api api = new Api("a");
api.Send("段光伟");
}
}
import java.util.*;
public class Api {
private static HashMap<String, Class<? extends Spi>> spis = new HashMap<String, Class<? extends Spi>>();
private String protocol;
public Api(String protocol) {
this.protocol = protocol;
}
public void Send(String msg) throws InstantiationException,
IllegalAccessException {
Spi spi = spis.get(protocol).newInstance();
spi.send("消息发送开始");
spi.send(msg);
spi.send("消息发送结束");
}
public static void Register(String protocol, Class<? extends Spi> cls) {
spis.put(protocol, cls);
}
}
public interface Spi {
void send(String msg);
}
public class SpiA implements Spi {
static {
Api.Register("a", SpiA.class);
}
@Override
public void send(String msg) {
System.out.println("SpiA:" + msg);
}
}
说明
Spi 实现的加载可以使用很多种方式,本文介绍了一种最基本的方式。