371 Stimmen

Unterschied zwischen SPI und API?

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?

13voto

Martin Janíček Punkte 368

Es gibt einen Aspekt, der anscheinend nicht oft hervorgehoben wird, der aber sehr wichtig ist, um zu verstehen, warum und wann API/SPI verwendet werden sollten.

Eine API/SPI-Trennung ist nur erforderlich, wenn Sie tatsächlich eine Plattform schreiben, und es wird erwartet, dass sie sich weiterentwickelt. Wenn Sie eine API schreiben und "wissen" es keine zukünftigen abwärtskompatiblen Verbesserungen erfordert, gibt es keinen wirklichen Grund, den Code in zwei Teile aufzuteilen. Auch wenn Sie überhaupt keine Plattform schreiben (Sie haben den gesamten API-Verbrauchercode unter Kontrolle), besteht der einzige Vorteil in einem guten und sauberen Objektdesign, da Sie jederzeit nach Belieben refaktorisieren können.

Sobald Sie jedoch mindestens einen Drittanbieter-Client für Ihre Plattform haben und Änderungen auf abwärtskompatible Weise vornehmen möchten, sollten Sie höchstwahrscheinlich API/SPI Split verwenden.

Zeigen wir es an einem der bekannten Java-Objekte Collection y Collections .


API: Collections ist eine Reihe von statischen Methoden für Dienstprogramme. Oft werden Klassen, die API-Objekte darstellen, definiert als final da es (zum Zeitpunkt der Kompilierung) sicherstellt, dass kein Client jemals "umsetzen" dieses Objekts und sie können sich auf "anrufen" seine statischen Methoden, z. B.

Collections.emptySet();

Da alle Kunden "anrufen" aber nicht "Durchführen" Die Autoren von JDK sind frei, neue Methoden hinzuzufügen in die Collections Objekt in der zukünftigen Version des JDK. Sie können sicher sein, dass es keinen Client kaputt machen kann, auch wenn es wahrscheinlich Millionen von Verwendungen gibt.


SPI: Collection ist eine Schnittstelle, die impliziert, dass jeder seine eigene Version davon implementieren kann. Daher haben die Autoren von JDK kann keine neuen Methoden hinzufügen denn es würde alle Kunden, die ihre eigenen Collection Durchführung (*).

Wenn eine zusätzliche Methode hinzugefügt werden soll, wird in der Regel eine neue Schnittstelle, z. B. Collection2 die die erste erweitert, muss erstellt werden. Der SPI-Client kann dann entscheiden, ob er auf die neue Version von SPI umsteigen und deren zusätzliche Methode implementieren will oder ob er bei der älteren Methode bleiben will.


Sie haben vielleicht schon verstanden, worum es geht. Wenn Sie beide Teile in einer einzigen Klasse zusammenfassen, ist Ihre API für jegliche Ergänzungen gesperrt. Das ist auch der Grund, warum gute Java APIs und Frameworks keine abstract class da sie ihre zukünftige Entwicklung im Hinblick auf die Abwärtskompatibilität blockieren würden.

Wenn noch etwas unklar ist, empfehle ich Ihnen, Folgendes zu überprüfen diese Seite in der die oben genannten Punkte ausführlicher erläutert werden.


(*) Beachten Sie, dass dies nur bis Java 1.8 gilt, das das Konzept der default Methoden, die in einer Schnittstelle definiert sind.

4voto

Chris Dennett Punkte 21894

Ich nehme an, ein SPI fügt sich in ein größeres System ein, indem es bestimmte Funktionen einer API implementiert und sich dann über Service-Lookup-Mechanismen als verfügbar registriert. Eine API wird vom Anwendungscode des Endnutzers direkt verwendet, kann aber SPI-Komponenten integrieren. Das ist der Unterschied zwischen Kapselung und direkter Nutzung.

4voto

tapasvi Punkte 222

Die Schnittstelle des Dienstanbieters ist die Dienstschnittstelle, die alle Anbieter implementieren müssen. Wenn keine der vorhandenen Provider-Implementierungen für Sie funktioniert, müssen Sie Ihren eigenen Service Provider schreiben (der die Service-Schnittstelle implementiert) und sich irgendwo registrieren (siehe den nützlichen Beitrag von Roman).

Wenn Sie die vorhandene Provider-Implementierung der Serviceschnittstelle wiederverwenden, verwenden Sie im Grunde die API dieses bestimmten Providers, die alle Methoden der Serviceschnittstelle sowie einige eigene öffentliche Methoden enthält. Wenn Sie Methoden der Anbieter-API außerhalb des SPI verwenden, nutzen Sie anbieterspezifische Funktionen.

3voto

ewernli Punkte 37122

In der Java-Welt sind verschiedene Technologien dafür gedacht, modular und "steckbar" in einen Anwendungsserver integriert zu werden. Es gibt also einen Unterschied zwischen

  • den Anwendungsserver
    • [SPI]
  • die steckbare Technologie
    • [API]
  • die Endbenutzeranwendung

Zwei Beispiele für solche Technologien sind JTA (der Transaktionsmanager) und JCA (Adapter für JMS oder Datenbanken). Aber es gibt noch andere.

Der Implementierer einer solchen steckbaren Technologie muss dann das SPI so implementieren, dass es im Anwendungsserver steckbar ist, und eine API bereitstellen, die von der Endbenutzeranwendung verwendet werden kann. Ein Beispiel aus JCA ist die ManagedConnection Schnittstelle, die Teil des SPI ist, und die Verbindung die Teil der Endbenutzer-API ist.

CodeJaeger.com

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.

Powered by:

X