1.10 SPI和API之间的区别?| Java Debug 笔记

334 阅读2分钟

本文正在参加「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();
    }
}