Java SPI機制
阿新 • • 發佈:2018-01-24
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 {@Overridepublic Object calc(int calcType) {Object value = Math.sin(calcType);logger.info("sin result: {}", value);
return value;
}}
計算開方:
public class SqrtCalc implements Calc {@Overridepublic Object calc(int calcType) {Object value = Math.sqrt(calcType);logger.info("sqrt result: {}", value);
return value;
}}
一個服務加載類:
@Componentpublic 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機制