1. 程式人生 > 程式設計 >Spring ProtocolResolver策略介面示例

Spring ProtocolResolver策略介面示例

ProtocolResolver是一個策略介面,可以用於自定義協議解析, 比如spring就有一個 “classpath:”開頭的特定協議(但是spring並不是自定義ProtocolResolver 實現來完成這個功能的)

@FunctionalInterface
public interface ProtocolResolver {
	@Nullable
	Resource resolve(String location,ResourceLoader resourceLoader);

}

@FunctionalInterface:宣告該介面是一個函式式介面,主要用於編譯級錯誤檢查,加上該註解,該介面中只能定義唯一一個方法。

spring提供了ProtocolResolver機制,用於匹配自定義的檔案schema來載入檔案;而且不干擾ResourceLoader的機制,最重要的是它會新增到spring環境下的所有的loader中。我們只需要擴充套件一個ProtocolResolver類,並將它在合適的實際加入到ResourceLoader即可,此後載入properties檔案時我們的ProtocolResolver總會被執行

具體用法如下:

自定義MyProtocolResolver,載入資源時,當我們輸入的資源路徑以path:開頭時,就會載入相對路徑下的config/下相應的資源。

public class MyProtocolResolver implements ProtocolResolver {
  public static final String PATH = "path:";
  @Override
  public Resource resolve(String location,ResourceLoader resourceLoader) {
    if (!location.startsWith(PATH))
      return null;
    String realPath = location.substring(5);
    String classPath = "classpath:config/" + realPath;
  
    return resourceLoader.getResource(classPath);
  }

}

測試:

DefaultResourceLoader resourceLoader=new DefaultResourceLoader();
resourceLoader.addProtocolResolver(new MyProtocolResolver());
Resource resource = resourceLoader.getResource("path:config.txt");
InputStream inputStream = resource.getInputStream();
StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];

for (int n; (n = inputStream.read(b)) != -1; ) {
out.append(new String(b,n));
}
System.out.println(out);

由此我們可以通過實現ProtocolResolver介面來定義我們自己的載入資源路徑,也可以自定義自己載入資源路徑的優先順序。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。