介紹
SPI:service provider interface
Java SPI 是 JDK 內(nèi)置的一種服務提供發(fā)現(xiàn)機制。它是Java中一種動態(tài)替換發(fā)現(xiàn)的機制毒租。比如說JDBC,我們在連接數(shù)據(jù)庫的時候需要用到java.sql.Driver 這個接口,但是Driver并沒有實現(xiàn)攘滩,而是提供了一套標準的 api 接口遏匆。而是在mysql包中的com.mysql.cj.jdbc.Driver實現(xiàn)了Driver。
別人定義的接口我去實現(xiàn)纳账。
如何實現(xiàn)SPI
- 需要在 classpath 下創(chuàng)建一個目錄,該目錄命名必須是:META-INF/services捺疼。
- 在該目錄下創(chuàng)建一個 properties 文件疏虫,該文件需要滿足以下幾個條件:
- 文件名必須是擴展的接口的全路徑名稱
- 文件內(nèi)部描述的是該擴展接口的所有實現(xiàn)類
- 文件的編碼格式是 UTF-8
- 通過 java.util.ServiceLoader 的加載機制來發(fā)現(xiàn)
SPI 的實際應用
以JDBC為例:
META-INF/service路徑下的文件里面寫的就是 mysql 的驅(qū)動實現(xiàn)。
文件中的內(nèi)容
跳轉(zhuǎn)后發(fā)現(xiàn)是對java.sql.Driver中實現(xiàn)
通過 SPI 機制把 java.sql.Driver 和 mysql 的驅(qū)動做了集成啤呼。這樣 就達到了各個數(shù)據(jù)庫廠商自己去實現(xiàn)數(shù)據(jù)庫連接卧秘,jdk 本身不關心你怎么實現(xiàn)。