Was ist der Unterschied zwischen Schnittstelle für Dienstanbieter (SPI) y Anwendungsprogrammierschnittstelle (API) ?
Genauer gesagt, was macht Java-Bibliotheken zu einer API und/oder SPI?
Was ist der Unterschied zwischen Schnittstelle für Dienstanbieter (SPI) y Anwendungsprogrammierschnittstelle (API) ?
Genauer gesagt, was macht Java-Bibliotheken zu einer API und/oder SPI?
Anders ausgedrückt: Die API sagt Ihnen, was eine bestimmte Klasse/Methode für Sie tut, und die SPI sagt Ihnen, was Sie tun müssen, um sich anzupassen.
Normalerweise sind API und SPI getrennt. Zum Beispiel, in JDBC die Driver
Klasse ist Teil des SPI: Wenn Sie nur JDBC verwenden wollen, müssen Sie es nicht direkt verwenden, aber jeder, der einen JDBC-Treiber implementiert, muss diese Klasse implementieren.
Manchmal überschneiden sie sich jedoch. En Connection
Schnittstelle es beide SPI und API: Sie verwenden es routinemäßig, wenn Sie einen JDBC-Treiber verwenden, und es muss vom Entwickler des JDBC-Treibers implementiert werden.
De Effektives Java, 2. Auflage :
Ein Rahmenwerk für Dienstanbieter ist ein System, in dem mehrere Dienstanbieter Dienstanbieter einen Dienst implementieren und das System stellt die Implementierungen seinen Kunden zur Verfügung stellt, wobei es die von den Implementierungen.
Es gibt drei wesentliche Komponenten eines Rahmenwerks für Dienstanbieter: ein Dienstschnittstelle, die Anbieter implementieren; eine Anbieterregistrierung API, die das System verwendet, um die Implementierungen registriert, und eine API für den Dienstzugang, die Clients verwenden, um eine Instanz des Dienstes zu erhalten. Die Dienst Zugriffs-API erlaubt normalerweise, aber aber nicht erforderlich, dass der Kunde einige Kriterien für die Auswahl eines Anbieters anzugeben. Unter das Fehlen einer solchen Spezifikation, gibt die API eine Instanz einer Standardimplementierung zurück. Der Dienst access API ist die "flexible statische Fabrik", die die Grundlage der Dienstanbieter-Frameworks bildet.
A Dienstanbieter-Frameworks ist eine [ ] Anbieter implementieren, um Instanzen ihres Dienstes Implementierung zu erstellen. In Ermangelung einer Dienstanbieter-Schnittstelle, werden Implementierungen registriert durch Klassennamen registriert und instanziiert instanziiert (Punkt 53). Im Fall von JDBC, spielt Connection die Rolle des Dienstschnittstelle, DriverManager.registerDriver ist die Anbieter-Registrierungs-API, DriverManager.getConnection ist die Dienstzugriffs-API, und Driver ist die Schnittstelle des Dienstanbieters.
Es gibt zahlreiche Varianten des Dienstanbieter-Framework-Musters. Zum Beispiel kann die Service Access API kann eine reichhaltigere Dienstschnittstelle zurückgeben zurückgeben als diejenige, die der Provider benötigt, unter Verwendung des Adapter-Musters [Gamma95, S. 139]. Hier ist eine einfache Implementierung mit einer Dienstanbieterschnittstelle und einem Standard-Provider:
// 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();
}
}
Der Unterschied zwischen API und SPI besteht darin, dass eine API zusätzlich einige konkrete Implementierungen bietet. In diesem Fall muss der Dienstanbieter einige APIs (genannt SPI) implementieren
Ein Beispiel ist JNDI:
JNDI bietet Schnittstellen und einige Klassen für die Kontextsuche. Die Standardmethode zum Nachschlagen eines Kontexts wird in IntialContext bereitgestellt. Diese Klasse verwendet intern SPI-Schnittstellen (mit NamingManager) für anbieterspezifische Implementierungen.
Zum besseren Verständnis siehe die JNDI-Architektur unten.
API steht für Application Programming Interface (Anwendungsprogrammierschnittstelle), wobei API ein Mittel zum Zugriff auf einen Dienst/eine Funktion ist, der/die von einer Software oder einer Plattform bereitgestellt wird.
SPI steht für Service Provider Interface, wobei SPI eine Möglichkeit ist, das Verhalten von Software oder einer Plattform zu injizieren, zu erweitern oder zu verändern.
API ist in der Regel das Ziel für den Zugang von Kunden zu einem Dienst und hat folgende Eigenschaften:
-->Eine API ist ein programmatischer Weg, um auf einen Dienst zuzugreifen und ein bestimmtes Verhalten oder eine bestimmte Ausgabe zu erreichen.
-->Vom Standpunkt der API-Entwicklung aus gesehen, ist die Hinzufügung für die Kunden überhaupt kein Problem.
-->Aber APIs, die einmal von Kunden genutzt werden, können (und sollten) nicht gelöscht werden, es sei denn, es gibt eine entsprechende Kommunikation, da dies eine vollständige Degradierung der Kundenerwartung
SPI hingegen richtet sich an Anbieter und hat die folgenden Eigenschaften:
-->SPI ist eine Möglichkeit, das Verhalten einer Software zu erweitern/verändern programmatisch)
-->Die SPI-Evolution unterscheidet sich von der API-Evolution, bei SPI ist die Entfernung kein Thema.
-->Die Hinzufügung von SPI-Schnittstellen wird Probleme verursachen und kann bestehende Implementierungen zerstören.
Für weitere Erklärungen klicken Sie hier: Schnittstelle zum Dienstanbieter
NetBeans' FAQ: Was ist ein SPI? Wie unterscheidet es sich von einer API?
API ist ein allgemeiner Begriff - ein Akronym für Application Programming Interface (Anwendungsprogrammierschnittstelle) - und bedeutet etwas (in Java in der Regel einige Java-Klassen), das eine Software zur Verfügung stellt, damit andere Software mit ihr kommunizieren kann.
SPI steht für Service Provider Interface. Es ist eine Teilmenge aller Dinge, die API-spezifisch sein können, für Situationen, in denen eine Bibliothek Klassen bereitstellt, die von der Anwendung (oder der API-Bibliothek) aufgerufen werden und die typischerweise die Dinge ändern, die die Anwendung tun kann.
Das klassische Beispiel ist JavaMail. Seine API hat zwei Seiten:
- Die API-Seite - die Sie aufrufen, wenn Sie einen Mail-Client schreiben oder ein Postfach lesen wollen
- Die SPI-Seite, wenn Sie einen Wire-Protocol-Handler bereitstellen, damit JavaMail mit einer neuen Art von Server kommunizieren kann, z. B. mit einem News- oder IMAP-Server
Die Benutzer der API müssen die SPI-Klassen nur selten sehen oder mit ihnen sprechen und umgekehrt.
Wenn in NetBeans von SPI die Rede ist, sind in der Regel Klassen gemeint, die ein Modul zur Laufzeit injizieren kann und die es NetBeans ermöglichen, neue Dinge zu tun. So gibt es zum Beispiel ein allgemeines SPI für die Implementierung von Versionskontrollsystemen. Verschiedene Module bieten Implementierungen dieses SPI für CVS, Subversion, Mercurial und andere Versionskontrollsysteme. Der Code, der mit Dateien arbeitet (die API-Seite), muss sich jedoch nicht darum kümmern, ob es ein Versionskontrollsystem gibt oder welches es ist.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.