1. 程式人生 > >Java SPI機制

Java SPI機制

ffffff type iterator path args gin int pub .html

Service Provider Interfaces 服務提供發現,動態替換發現的機制

示例:

一個接口:

public interface Calc {
    Logger logger = LoggerFactory.getLogger(Calc.class);
    Object calc(int calcType);
}

兩個實現:

計算sin值:

public class SinCalc implements Calc {
    @Override
    public Object calc(int calcType) {
        Object value = Math.sin(calcType);
        logger.info("sin result: {}", value);
        return value;
    }
}
計算開方:
public class SqrtCalc implements Calc {
    @Override
    public Object calc(int calcType) {
        Object value = Math.sqrt(calcType);
        logger.info("sqrt result: {}", value);
        return value;
    }
}

一個服務加載類:

@Component
public class SpiService {
    public Object execCalc(int value){
        ServiceLoader<Calc> loader = ServiceLoader.load(Calc.class);
        Iterator<Calc> iterator = loader.iterator();
        while (iterator.hasNext()) {
            return iterator.next().calc(value);
        }
        return null;
    }
    public static void main(String[] args) {
        new SpiService().execCalc(100);
    }
}

一個配置文件:classpath:META-INF/services/xxx.xxx.Calc

內容:需要加載的功能類

如:xxx.xxx.SqrtCalc

則 運行服務加載類執行,輸出計算開方。

示例應用項目:https://github.com/windwant/spring-boot-test

官方文檔:https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html

Java SPI機制