Spring ProtocolResolver策略接口示例
ProtocolResolver是一個策略接口,可以用于自定義協(xié)議解析, 比如spring就有一個 “classpath:”開頭的特定協(xié)議(但是spring并不是自定義ProtocolResolver 實現(xiàn)來完成這個功能的)
@FunctionalInterface public interface ProtocolResolver { @Nullable Resource resolve(String location, ResourceLoader resourceLoader); }
@FunctionalInterface:聲明該接口是一個函數(shù)式接口,主要用于編譯級錯誤檢查,加上該注解,該接口中只能定義唯一一個方法。
spring提供了ProtocolResolver機制,用于匹配自定義的文件schema來加載文件;而且不干擾ResourceLoader的機制,最重要的是它會添加到spring環(huán)境下的所有的loader中。我們只需要擴展一個ProtocolResolver類,并將它在合適的實際加入到ResourceLoader即可,此后加載properties文件時我們的ProtocolResolver總會被執(zhí)行
具體用法如下:
自定義MyProtocolResolver,加載資源時,當(dāng)我們輸入的資源路徑以path:開頭時,就會加載相對路徑下的config/下相應(yīng)的資源。
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, 0, n));
}
System.out.println(out);
由此我們可以通過實現(xiàn)ProtocolResolver接口來定義我們自己的加載資源路徑,也可以自定義自己加載資源路徑的優(yōu)先級。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
RabbitMQ交換機使用場景和消息可靠性總結(jié)分析
這篇文章主要為大家介紹了RabbitMQ交換機使用場景和消息可靠性總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01