1.什麼是java的spi
SPI 全稱為 (Service Provider Interface) ,是JDK内置的一種服務提供發現機制。 目前有不少架構用它來做服務的擴充發現, 簡單來說,它就是一種動态替換發現的機制, 舉個例子來說, 有個接口,想運作時動态的給它添加實作,你隻需要添加一個實作。
具體是在JAR包的"src/META-INF/services/"目錄下建立一個檔案,檔案名是接口的全限定名,檔案的内容可以有多行,每行都是該接口對應的具體實作類的全限定名.
2.運用場景
比如你想擴充一些架構,如spring的一些功能,就是要實作它接口,然後自己配置了。
3.例子代碼
先定義接口:
package com.ming.spi.service;
/**
* 定義一個dog的接口
* @author ming
*
*/
public interface DogService {
void sleep();
}
然後定義兩個實作:
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檔案中的代碼:
com.ming.spi.service.imp.BlackDogServiceImpl
com.ming.spi.service.imp.WhilteDogServiceImpl
最後運作結果就是你需要的兩個實作。
最後總結一下:
java的spi運作流程是運用java.util.ServiceLoader這個類的load方法去在src/META-INF/services/尋找對應的全路徑接口名稱的檔案,然後在檔案中找到對應的實作方法并注入實作,然後你可以運用了
參考:http://www.cnblogs.com/zhongkaiuu/articles/5040971.html
用得越多不知道的東西越多......慢慢醬油中...