spi是原生java的組件,通過META-INF/services目錄進行註冊,通過ServiceLoader進行載入,一般可以用在組件開發中,你在公用組件中封裝好邏輯,將個性化的部分抽象出一個介面,介面通過spi的方式進行載入,在外部開發人員引用你的組件之後,通過實現介面來擴展個性化的功能,再通過 ...
spi是原生java的組件,通過META-INF/services目錄進行註冊,通過ServiceLoader進行載入,一般可以用在組件開發中,你在公用組件中封裝好邏輯,將個性化的部分抽象出一個介面,介面通過spi的方式進行載入,在外部開發人員引用你的組件之後,通過實現介面來擴展個性化的功能,再通過META-INF/services對實現類進行註冊。
組件端
先定義一個公開的介面
public interface SpiHello {
void printHello();
}
一個公開的組件
public static void print() {
InputStream resource = Tool.class.getClassLoader().getResourceAsStream("licence.txt");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int bufSize = 1024;
byte[] buffer = new byte[bufSize];
int len = 0;
while (true) {
try {
if (!(-1 != (len = resource.read(buffer, 0, bufSize))))
break;
}
catch (IOException e) {
throw new RuntimeException(e);
}
bos.write(buffer, 0, len);
}
ServiceLoader<SpiHello> spiHellos = ServiceLoader.load(SpiHello.class);
Iterator<SpiHello> iterable = spiHellos.iterator();
while (iterable.hasNext()) {
iterable.next().printHello();
}
System.out.println("value=" + bos.toString());
}
在開發人員使用時,需要註冊他的實現類
com.lind.pk.Tool.print();
結果
註意,在組件內部讀文件時,需要採用文件流的方式,否則,在調用地將出現無法載入的問題
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!