Java的Spi

Ho1d_F0rward發表於2024-08-17

什麼是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

相關文章