什麼是SPI?
SPI 全稱:Service Provider Interface,是Java提供的一套用來被第三方實現或者擴充套件的介面,它可以用來啟用框架擴充套件和替換元件。
面向的物件的設計裡,我們一般推薦模組之間基於介面程式設計,模組之間不對實現類進行硬編碼。一旦程式碼裡涉及具體的實現類,就違反了可拔插的原則,如果需要替換一種實現,就需要修改程式碼。
為了實現在模組裝配的時候不用在程式裡動態指明,這就需要一種服務發現機制。java spi就是提供這樣的一個機制:為某個介面尋找服務實現的機制。這有點類似IOC的思想,將裝配的控制權移到了程式之外。
SPI 案例實現
假設我們有一個日誌記錄系統,需要支援不同的日誌實現。使用 Java SPI,我們可以將日誌記錄器的實現與應用程式解耦,實現更好的靈活性和可擴充套件性。
// Logger.java
public interface Logger {
void log(String message);
}
然後,我們實現幾個具體的日誌記錄器:
// ConsoleLogger.java
public class ConsoleLogger implements Logger {
public void log(String message) {
System.out.println(message);
}
}
// FileLogger.java
public class FileLogger implements Logger {
public void log(String message) {
// 將訊息寫入檔案
}
}
// DatabaseLogger.java
public class DatabaseLogger implements Logger {
public void log(String message) {
// 將訊息寫入資料庫
}
}
接下來,我們在 META-INF/services 目錄下建立一個名為 com.example.Logger的檔案,並在其中列出所有的日誌記錄器實現類:
com.example.ConsoleLogger
com.example.FileLogger
com.example.DatabaseLogger
最後,在應用程式中使用 ServiceLoader來動態載入和使用這些日誌記錄器:
// Application.java
import java.util.ServiceLoader;
public class Application {
public static void main(String[] args) {
ServiceLoader<Logger> loader = ServiceLoader.load(Logger.class);
for (Logger logger : loader) {
logger.log("This is a log message.");
}
}
}
參考文件
https://www.cnblogs.com/better-farther-world2099/articles/17092783.html