[java] Разница между SPI и API?



Answers

Из эффективной Java, 2-е издание :

Рамка поставщика услуг - это система, в которой несколько поставщиков услуг внедряют сервис, и система делает реализации доступными для своих клиентов, отделяя их от реализаций.

Существуют три основных компонента структуры поставщика услуг: сервисный интерфейс, который реализуют поставщики; API регистрации поставщика, который система использует для регистрации реализации, предоставляя клиентам доступ к ним; и API доступа к услугам, которые клиенты используют для получения экземпляра службы. API доступа к услугам обычно позволяет, но не требует от клиента указания некоторых критериев для выбора поставщика. В отсутствие такой спецификации API возвращает экземпляр реализации по умолчанию. API доступа к услугам - это «гибкая статическая фабрика», которая лежит в основе структуры поставщика услуг.

Необязательный четвертый компонент структуры поставщика услуг - это интерфейс поставщика услуг, который провайдеры реализуют для создания экземпляров реализации своих услуг. В отсутствие интерфейса поставщика услуг реализации регистрируются по имени класса и отражаются рефлексивно (пункт 53). В случае JDBC Connection играет роль интерфейса службы, DriverManager.registerDriver - это API регистрации провайдера, DriverManager.getConnection - API доступа к услугам, а Driver - это интерфейс поставщика услуг.

Существует множество вариантов шаблона структуры поставщика услуг. Например, API доступа к сервису может возвращать более богатый интерфейс службы, чем тот, который требуется от провайдера, используя шаблон адаптера [Gamma95, p. 139]. Вот простая реализация с интерфейсом поставщика услуг и поставщиком по умолчанию:

// Service provider framework sketch

// Service interface
public interface Service {
    ... // Service-specific methods go here
}

// 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();
    }
}
Question

В чем разница между интерфейсом поставщика услуг (SPI) и интерфейсом прикладного программирования (API) ?

Более конкретно, для библиотек Java, что делает их API и / или SPI?




API означает интерфейс прикладного программирования, где API - это средство для доступа к сервису / функции, предоставляемому каким-либо программным обеспечением или платформой.

SPI означает интерфейс поставщика услуг, где SPI - это способ внедрения, расширения или изменения поведения программного обеспечения или платформы.

API обычно предназначен для клиентов для доступа к службе и обладает следующими свойствами:

-> API - это программный способ доступа к службе для достижения определенного поведения или вывода

-> С точки зрения эволюции API, добавление не является проблемой для клиентов

-> Но API, который когда-то использовался клиентами, он не может (и не должен) быть изменен / удален, если нет соответствующих сообщений, поскольку его полное ухудшение ожидания клиента

SPI с другой стороны нацелены на поставщиков и обладают следующими свойствами:

-> SPI - это способ расширить / изменить поведение программного обеспечения или платформы (программируемые и программные)

-> Развитие SPI отличается от эволюции API, при удалении SPI это не проблема

-> Добавление интерфейсов SPI вызовет проблемы и может нарушить существующие реализации

Для получения дополнительной информации нажмите здесь: Интерфейс поставщика услуг




В мире Java различные технологии должны быть модульными и «подключаемыми» к серверу приложений. Тогда существует разница между

  • сервер приложений
    • [SPI]
  • подключаемая технология
    • [API]
  • приложение конечного пользователя

Двумя примерами таких технологий являются JTA (менеджер транзакций) и JCA (адаптер для JMS или базы данных). Но есть и другие.

Разработчик такой подключаемой технологии должен затем реализовать SPI для подключения в приложении. сервер и предоставить API, который будет использоваться приложением конечного пользователя. Примером от JCA является интерфейс ManagedConnection который является частью SPI, и Connection которое является частью API конечных пользователей.




Я полагаю, что SPI размещается в более крупной системе, реализуя определенные функции API, а затем регистрируется как доступный через механизмы поиска службы. API напрямую используется кодом приложения конечного пользователя, но может интегрировать компоненты SPI. Это разница между инкапсулированием и прямым использованием.




Related



Tags

java java   api