SPI 全稱爲 (Service Provider Interface) ,是JDK內置的一種服務提供發現機制。 目前有很多框架用它來作服務的擴展發現, 簡單來講,它就是一種動態替換髮現的機制, 舉個例子來講, 有個接口,想運行時動態的給它添加實現,你只須要添加一個實現。html
具體是在JAR包的"src/META-INF/services/"目錄下創建一個文件,文件名是接口的全限定名,文件的內容能夠有多行,每行都是該接口對應的具體實現類的全限定名.java
好比你想擴展一些框架,如spring的一些功能,就是要實現它接口,而後本身配置了。spring
先定義接口:框架
package com.ming.spi.service; /** * 定義一個dog的接口 * @author ming * */ public interface DogService { void sleep(); }
而後定義兩個實現:ide
package com.ming.spi.service.imp; import com.ming.spi.service.DogService; public class BlackDogServiceImpl implements DogService{ @Override public void sleep() { System.out.println("黑色dog。。。汪汪叫,不睡覺..."); } }
package com.ming.spi.service.imp; import com.ming.spi.service.DogService; public class WhilteDogServiceImpl implements DogService{ @Override public void sleep() { System.out.println("白色dog。。。呼呼大睡覺..."); } }
最後是一個測試代碼:測試
package com.ming.spi.service; import java.util.ServiceLoader; public class Test { public static void main(String[] args) throws Exception { ServiceLoader<DogService> loaders = ServiceLoader.load(DogService.class); for (DogService d : loaders) { d.sleep(); } } }
而後是src/META-INF/services/com.ming.spi.service.DogService文件中的代碼:spa
com.ming.spi.service.imp.BlackDogServiceImpl
com.ming.spi.service.imp.WhilteDogServiceImpl
最後運行結果就是你須要的兩個實現。code
最後總結一下:htm
java的spi運行流程是運用java.util.ServiceLoader這個類的load方法去在src/META-INF/services/尋找對應的全路徑接口名稱的文件,而後在文件中找到對應的實現方法並注入實現,而後你能夠運用了blog
參考:http://www.cnblogs.com/zhongkaiuu/articles/5040971.html
用得越多不知道的東西越多......慢慢醬油中...