Qual é a diferença entre Service Provider Interface (SPI) e Application Programming Interface (API) ?
Mais especificamente, para bibliotecas Java, o que as torna uma API e / ou SPI?
Qual é a diferença entre Service Provider Interface (SPI) e Application Programming Interface (API) ?
Mais especificamente, para bibliotecas Java, o que as torna uma API e / ou SPI?
Em outras palavras, a API informa o que uma classe / método específico faz por você, e o SPI informa o que você deve fazer para estar em conformidade.
Normalmente, API e SPI são separados. Por exemplo, no JDBC, a Driver
classe faz parte do SPI: se você simplesmente deseja usar o JDBC, não precisa usá-lo diretamente, mas todos que implementam um driver JDBC devem implementar essa classe.
Às vezes, eles se sobrepõem. A Connection
interface de é tanto SPI e API: Você usá-lo rotineiramente quando você usa um driver JDBC e ele precisa ser implementado pelo desenvolvedor do driver JDBC.
@SomeAnnotation
à minha classe para selecioná-la por alguma estrutura, essa classe de anotaçãoSomeAnnotation.class
será considerada parte do SPI, mesmo que eu não a esteja estendendo ou implementando tecnicamente?Do Effective Java, 2ª Edição :
fonte
A diferença entre API e SPI ocorre quando uma API fornece adicionalmente algumas implementações concretas. Nesse caso, o provedor de serviços precisa implementar algumas APIs (chamadas SPI)
Um exemplo é JNDI:
O JNDI fornece interfaces e algumas classes para pesquisa de contexto. A maneira padrão de procurar um contexto é fornecida no IntialContext. Essa classe internamente usará interfaces SPI (usando o NamingManager) para implementações específicas do provedor.
Veja a arquitetura JNDI abaixo para entender melhor.
fonte
API significa Application Programming Interface, onde API é um meio de acessar um serviço / função fornecida por algum tipo de software ou plataforma.
SPI significa Service Provider Interface, onde SPI é uma maneira de injetar, estender ou alterar o comportamento de software ou plataforma.
A API é normalmente destinada aos clientes para acessar um serviço e possui as seguintes propriedades:
-> API é uma maneira programática de acessar um serviço para obter um determinado comportamento ou saída
-> Do ponto de vista da evolução da API, a adição não é problema para os clientes
-> Mas as APIs, uma vez utilizadas pelos clientes, não podem (e não devem) ser alteradas / excluídas, a menos que haja uma comunicação adequada, pois é uma degradação completa da expectativa do cliente
O SPI, por outro lado, é direcionado a fornecedores e possui as seguintes propriedades:
-> SPI é uma maneira de estender / alterar o comportamento de um software ou plataforma (programável versus programático)
-> A evolução do SPI é diferente da evolução da API, na remoção do SPI não é um problema
-> A adição de interfaces SPI causará problemas e poderá interromper as implementações existentes
Para obter mais explicações, clique aqui: Interface do Provedor de Serviços
fonte
Perguntas frequentes do NetBeans: O que é um SPI? Qual é a diferença de uma API?
fonte
Há um aspecto que parece pouco destacado, mas é muito importante entender o raciocínio por trás da existência da divisão API / SPI.
A divisão API / SPI é necessária apenas quando a plataforma deve evoluir. Se você escreve uma API e "sabe" que ela nunca exigirá melhorias futuras, não há motivos reais para dividir seu código nas duas partes (além de criar um design de objeto limpo).
Mas esse quase nunca é o caso e as pessoas precisam ter liberdade para evoluir a API junto com os requisitos futuros - de uma maneira compatível com versões anteriores.
Observe que todas as opções acima pressupõem que você está construindo uma plataforma que outras pessoas usam e / ou estendem e não sua própria API, na qual você tem todo o código do cliente sob controle e, portanto, pode refatorar conforme necessário.
Vamos mostrá-lo em um dos objetos Java
Collection
eCollections
.API:
Collections
é um conjunto de métodos estáticos de utilidade. Freqüentemente, as classes que representam o objeto da API são definidas comofinal
asseguram (no momento da compilação) que nenhum cliente possa "implementar" esse objeto e que elas dependam de "chamar" seus métodos estáticos, por exemploComo todos os clientes estão "chamando", mas não "implementando" , os autores do JDK podem adicionar novos métodos ao
Collections
objeto na versão futura do JDK. Eles podem ter certeza de que não podem prejudicar nenhum cliente, mesmo que haja provavelmente milhões de usos.SPI:
Collection
é uma interface que implica que qualquer pessoa pode implementar sua própria versão. Portanto, os autores do JDK não podem adicionar novos métodos, pois isso quebraria todos os clientes que escreveram sua própriaCollection
implementação (*).Normalmente, quando é necessário adicionar um método adicional, é necessário criar uma nova interface, por exemplo,
Collection2
que estende a anterior. O cliente SPI pode decidir se deseja migrar para a nova versão do SPI e implementar seu método adicional ou se deseja continuar com o anterior.Você já deve ter visto o ponto. Se você combinar as duas partes em uma única classe, sua API será bloqueada de quaisquer adições. Essa também é a razão pela qual as boas APIs e estruturas Java não são expostas
abstract class
, pois bloqueariam sua evolução futura com relação à compatibilidade com versões anteriores.Se algo ainda não estiver claro, recomendo verificar esta página que explica o acima em mais detalhes.
(*) Observe que isso é verdade apenas até o Java 1.8, que introduz o conceito de
default
métodos definidos em uma interface.fonte
Suponho que um SPI se encaixe em um sistema maior implementando certos recursos de uma API e, em seguida, registrando-se como disponível através de mecanismos de pesquisa de serviço. Uma API é usada diretamente pelo código do aplicativo do usuário final, mas pode integrar componentes SPI. É a diferença entre encapsulamento e uso direto.
fonte
A interface do provedor de serviços é a interface de serviço que todos os provedores devem implementar. Se nenhuma das implementações de provedores existentes funcionar para você, você precisa escrever seu próprio provedor de serviços (implementando a interface de serviço) e se registrar em algum lugar (consulte a publicação útil de Roman).
Se você está reutilizando a implementação de provedor existente da interface de serviço, está basicamente usando a API desse provedor específico, que inclui todos os métodos de interface de serviço, além de alguns métodos públicos próprios. Se você estiver usando métodos da API do provedor fora do SPI, estará usando recursos específicos do provedor.
fonte
No mundo Java, diferentes tecnologias devem ser modulares e "conectáveis" em um servidor de aplicativos. Existe então uma diferença entre
Dois exemplos dessas tecnologias são JTA (o gerenciador de transações) e JCA (adaptador para JMS ou banco de dados). Mas existem outros.
O implementador de uma tecnologia tão conectável deve implementar o SPI para ser plugável no aplicativo. servidor e forneça uma API a ser usada pelo aplicativo do usuário final. Um exemplo da JCA é a interface ManagedConnection que faz parte da SPI e a Conexão que faz parte da API do usuário final.
fonte