本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:SPI和API之间的区别?
服务提供商接口(SPI)和应用程序编程接口(API)有什么区别?
更具体地说,同样作为Java库,是什么使它们成为API和/或SPI?
回答1:
1, API是您为实现目标而调用和使用的类/接口/方法/ ...的描述 2, SPI是您为实现目标而扩展和实现的类/接口/方法/ ...的描述。
换句话说,API会告诉您特定的类/方法为您执行什么操作,而SPI则告诉您必须执行哪些操作才能符合要求。
通常,API和SPI是分开的。例如,在JDBC中,Driver类是SPI的一部分:如果只想使用JDBC,则不需要直接使用它,但是实现JDBC驱动程序的每个人都必须实现该类。
但是,有时它们会重叠。Connection接口既是SPI也是API:当您使用JDBC驱动程序,它需要通过JDBC驱动程序的开发者来实现。
回答2:
Effective java书上说:
服务提供者框架是一个多个服务提供者实现了一项服务的系统,然后,系统会将实施方案提供给其客户,从而将其与实施方案解耦。
服务提供者框架包含三个基本组件:服务提供者实现的服务接口; 服务提供者注册API,系统用来注册并实现,使客户可以访问它们; 以及服务访问API,客户端使用该API来获取服务的实例。 服务访问API通常允许但不要求客户端指定一些用于选择提供程序的条件。 在没有此类规范的情况下,API返回默认实现的实例。 服务访问API是“灵活的静态工厂”,它构成了服务提供者框架的基础。
// Service provider interface
public interface Provider {
Service newService();
}
// Noninstantiable class for service registration and access
public class Services {
private Services() { } // Prevents instantiation (Item 4)
// Maps service names to services
private static final Map<String, Provider> providers =
new ConcurrentHashMap<String, Provider>();
public static final String DEFAULT_PROVIDER_NAME = "<def>";
// Provider registration API
public static void registerDefaultProvider(Provider p) {
registerProvider(DEFAULT_PROVIDER_NAME, p);
}
public static void registerProvider(String name, Provider p){
providers.put(name, p);
}
// Service access API
public static Service newInstance() {
return newInstance(DEFAULT_PROVIDER_NAME);
}
public static Service newInstance(String name) {
Provider p = providers.get(name);
if (p == null)
throw new IllegalArgumentException(
"No provider registered with name: " + name);
return p.newService();
}
}