Apa perbedaan antara Antarmuka Penyedia Layanan (SPI) dan Antarmuka Pemrograman Aplikasi (API) ?
Lebih khusus, untuk perpustakaan Java, apa yang membuatnya menjadi API dan / atau SPI?
Apa perbedaan antara Antarmuka Penyedia Layanan (SPI) dan Antarmuka Pemrograman Aplikasi (API) ?
Lebih khusus, untuk perpustakaan Java, apa yang membuatnya menjadi API dan / atau SPI?
Dengan kata lain, API memberi tahu Anda apa yang dilakukan kelas / metode tertentu untuk Anda, dan SPI memberi tahu Anda apa yang harus Anda lakukan untuk menyesuaikan diri.
Biasanya API dan SPI terpisah. Misalnya, dalam JDBC yang Driver
kelas merupakan bagian dari SPI: Jika Anda hanya ingin menggunakan JDBC, Anda tidak perlu menggunakannya secara langsung, tapi semua orang yang menerapkan driver JDBC harus menerapkan kelas itu.
Namun, terkadang mereka tumpang tindih. The Connection
antarmuka adalah baik SPI dan API: Anda menggunakannya secara rutin ketika Anda menggunakan driver JDBC dan perlu dilaksanakan oleh pengembang driver JDBC.
@SomeAnnotation
ke kelas saya untuk mengambilnya dengan beberapa kerangka kerja, akankah kelas anotasi iniSomeAnnotation.class
dianggap sebagai bagian dari SPI, meskipun saya tidak secara teknis memperluas atau mengimplementasikannya?Dari Java Efektif, Edisi ke-2 :
sumber
Perbedaan antara API dan SPI muncul ketika API juga menyediakan beberapa implementasi konkret. Dalam hal ini, penyedia layanan harus mengimplementasikan beberapa API (disebut SPI)
Contohnya adalah JNDI:
JNDI menyediakan antarmuka & beberapa kelas untuk pencarian konteks. Cara default untuk mencari konteks disediakan di IntialContext. Kelas ini secara internal akan menggunakan antarmuka SPI (menggunakan NamingManager) untuk implementasi khusus penyedia.
Lihat Arsitektur JNDI di bawah ini untuk pemahaman yang lebih baik.
sumber
API adalah singkatan dari Application Programming Interface, di mana API adalah sarana untuk mengakses layanan / fungsi yang disediakan oleh beberapa jenis perangkat lunak atau platform.
SPI adalah singkatan dari Service Provider Interface, di mana SPI adalah cara untuk menyuntikkan, memperluas atau mengubah perilaku untuk perangkat lunak atau platform.
API biasanya menargetkan klien untuk mengakses layanan dan memiliki properti berikut:
-> API adalah cara terprogram mengakses layanan untuk mencapai perilaku atau keluaran tertentu
-> Dari sudut pandang evolusi API, penambahan tidak ada masalah sama sekali untuk klien
-> Tetapi API yang pernah digunakan oleh klien tidak dapat (dan seharusnya tidak) diubah / dihapus kecuali ada komunikasi yang sesuai, karena merupakan degradasi lengkap dari harapan klien
SPI pada bagian lain ditargetkan untuk penyedia dan memiliki sifat-sifat berikut:
-> SPI adalah cara untuk memperluas / mengubah perilaku perangkat lunak atau platform (dapat diprogram vs. terprogram)
-> Evolusi SPI berbeda dari evolusi API, dalam penghapusan SPI tidak ada masalah
-> Penambahan antarmuka SPI akan menyebabkan masalah dan dapat merusak implementasi yang ada
Untuk penjelasan lebih lanjut klik di sini: Antarmuka Penyedia Layanan
sumber
FAQ NetBeans: Apa itu SPI? Apa bedanya dengan API?
sumber
Ada satu aspek yang tampaknya tidak terlalu disorot tetapi sangat penting untuk memahami alasan di balik keberadaan perpecahan API / SPI.
Perpecahan API / SPI hanya diperlukan saat platform diharapkan untuk berkembang. Jika Anda menulis API dan "tahu" itu tidak akan memerlukan perbaikan di masa mendatang, tidak ada alasan nyata untuk memecah kode Anda menjadi dua bagian (selain membuat desain objek bersih).
Tapi ini hampir tidak pernah terjadi dan orang perlu memiliki kebebasan untuk mengembangkan API bersama dengan persyaratan di masa depan - dengan cara yang kompatibel.
Perhatikan bahwa semua hal di atas mengasumsikan Anda sedang membangun platform yang digunakan dan / atau diperluas orang lain dan bukan API Anda sendiri di mana Anda memiliki semua kode klien di bawah kendali dan dengan demikian dapat memperbaiki sesuai kebutuhan Anda.
Mari kita tunjukkan pada salah satu objek Java yang terkenal
Collection
danCollections
.API:
Collections
adalah seperangkat metode statis utilitas. Seringkali kelas yang mewakili objek API didefinisikan sebagaifinal
memastikan (pada waktu kompilasi) bahwa tidak ada klien yang dapat "mengimplementasikan" objek itu dan mereka dapat bergantung pada "memanggil" metode statisnya, misalnyaKarena semua klien "menelepon" tetapi tidak "menerapkan" , penulis JDK bebas untuk menambahkan metode baru ke
Collections
objek di versi JDK yang akan datang. Mereka dapat yakin itu tidak dapat menghancurkan klien mana pun, bahkan jika mungkin ada jutaan penggunaan.SPI:
Collection
adalah antarmuka yang menyiratkan bahwa siapa pun dapat mengimplementasikan versinya sendiri. Dengan demikian, penulis JDK tidak dapat menambahkan metode baru ke dalamnya karena akan menghancurkan semua klien yang menulis sendiriCollection
implementasi (*).Biasanya ketika metode tambahan diperlukan untuk ditambahkan, antarmuka baru, misalnya
Collection2
yang meluas yang sebelumnya perlu dibuat. Klien SPI kemudian dapat memutuskan apakah akan bermigrasi ke versi baru SPI dan mengimplementasikan metode tambahan itu atau apakah akan tetap menggunakan yang lebih lama.Anda mungkin sudah mengerti intinya. Jika Anda menggabungkan kedua bagian menjadi satu kelas, API Anda diblokir dari penambahan apa pun. Itu juga alasan mengapa API dan Kerangka Java yang bagus tidak terbuka
abstract class
karena mereka akan memblokir evolusi masa depan mereka sehubungan dengan kompatibilitas ke belakang.Jika ada sesuatu yang masih belum jelas, saya sarankan untuk memeriksa halaman ini yang menjelaskan hal di atas secara lebih rinci.
(*) Catatan ini benar hanya sampai Java 1.8 yang memperkenalkan konsep
default
metode yang didefinisikan dalam antarmuka.sumber
Saya kira slot SPI ke dalam sistem yang lebih besar dengan mengimplementasikan fitur-fitur tertentu dari API, dan kemudian mendaftarkan dirinya sebagai tersedia melalui mekanisme pencarian layanan. API digunakan oleh kode aplikasi pengguna akhir secara langsung, tetapi dapat mengintegrasikan komponen SPI. Perbedaan antara enkapsulasi dan penggunaan langsung.
sumber
Antarmuka penyedia layanan adalah antarmuka layanan yang harus diterapkan oleh semua penyedia. Jika tidak ada implementasi penyedia yang ada bekerja untuk Anda, Anda perlu menulis penyedia layanan Anda sendiri (mengimplementasikan antarmuka layanan) dan mendaftar di suatu tempat (lihat posting berguna oleh Roman).
Jika Anda menggunakan kembali implementasi penyedia antarmuka layanan yang ada, pada dasarnya Anda menggunakan API penyedia tertentu itu, yang mencakup semua metode antarmuka layanan plus beberapa metode publik sendiri. Jika Anda menggunakan metode API penyedia di luar SPI, Anda menggunakan fitur khusus penyedia.
sumber
Di dunia Java, berbagai teknologi dimaksudkan untuk menjadi modular dan "pluggable" ke dalam server aplikasi. Kemudian ada perbedaan di antara keduanya
Dua contoh teknologi tersebut adalah JTA (manajer transaksi) dan JCA (adaptor untuk JMS atau database). Tapi ada yang lain.
Pelaksana teknologi pluggable tersebut kemudian harus mengimplementasikan SPI agar dapat dicolokkan ke dalam aplikasi. server dan menyediakan API untuk digunakan oleh aplikasi pengguna akhir. Contoh dari JCA adalah antarmuka ManagedConnection yang merupakan bagian dari SPI, dan Koneksi yang merupakan bagian dari API pengguna akhir.
sumber