1. 程式人生 > >JAVA中API和SPI的區別

JAVA中API和SPI的區別

* API(Application Programming Interface )

在java中,API是指可以用來完成某項功能的類、介面或者方法。

SPI(Service Provider Interface)

SPI是指用來繼承、擴充套件,完成自定義功能的類、介面或者方法。

  • API直接為你提供了功能,你使用API就能完成任務。
  • SPI是一種回撥的思想。回撥是指在使用api時,可以向api傳入一個類或者方法,api在合適的時間呼叫類或者方法。

SPI是在一些通用的標準中,為標準的實現產商提供的擴充套件點。標準在上層提供API,API內部使用了SPI,當API被客戶使用時,會動態從當前執行的classpath中尋找該SPI的實現,然後使用該SPI的實現來完成API的功能。

SPI的實現方式是:提供實現的實現類打包成Jar檔案,這個Jar檔案裡面必須有META-INF目錄,其下有services目錄,包含一個文字檔案,檔名即為SPI介面的全名,檔案的內容該jar包中提供的SPI介面的實現類名。

舉一個著名的例子:

mysql的驅動包提供了java.sql.Driver這個SPI的實現,實現類是com.mysql.jdbc.Driver,在mysql-connector-java-5.1.6.jar中,我們可以看到有一個META-INF/services目錄,目錄下有一個檔名為java.sql.Driver的檔案,其中的內容是com.mysql.jdbc.Driver。
在執行DriverManager.getDriver並傳入引數“com.mysql.jdbc.Driver”時,DriverManager會從mysql-connector-java-5.1.6.jar中找到com.mysql.jdbc.Driver並例項化返回一個com.mysql.jdbc.Driver的例項。