Spring中如何实现自定义的ProtocolResolver策略接口示例?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2303个文字,预计阅读时间需要10分钟。
%E2%80%9C%E5%8D%8F%E8%AE%AE%E8%A7%A3%E6%9E%90%E5%99%A8%E6%98%AF%E4%B8%80%E4%B8%AA%E6%8E%A5%E5%8F%A3%EF%BC%8C%E5%8F%AF%E4%BB%A5%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8D%8F%E8%AE%AE%E8%A7%A3%E6%9E%90%EF%BC%8C%E7%94%A8%E4%BA%8E%E8%A7%A3%E6%9E%90%E5%BC%80%E5%A4%B4%E5%BC%80%E5%A4%B9%E7%9A%84%E7%89%B9%E5%AE%9A%E5%8D%8F%E8%AE%AE%EF%BC%8C%E6%9C%AC%E8%B4%A8%E4%B8%8D%E6%98%AF%E5%8F%AF%E8%83%BD%E8%A2%AB%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%EF%BC%8C%E4%BD%86%E6%98%AF%E5%9C%A8%E5%BC%80%E5%A4%B4%E5%BC%80%E5%A4%B9%E4%B8%AD%E4%BD%BF%E7%94%A8%E7%9A%84%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%8A%A9%E6%95%BA%E6%9C%BA%E6%9E%B6%E6%9E%84%E5%AE%9E%E7%8E%B0%E8%BF%99%E4%B8%AA%E5%8A%9F%E8%83%BD%EF%BC%8C%E7%9B%B4%E6%8E%A5%E6%8E%A5%E5%8F%A3%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E4%BE%9D%E8%B5%96%E6%9E%84%E5%BB%BA%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E6%98%AF%E4%B8%80%E4%B8%AA%E5%8A%9F%E8%83%BD%E5%BC%95%E5%85%A5%E7%9A%84%E6%96%B9%E5%BC%8F%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8
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, 0, n));
}
System.out.println(out);
由此我们可以通过实现ProtocolResolver接口来定义我们自己的加载资源路径,也可以自定义自己加载资源路径的优先级。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。
本文共计2303个文字,预计阅读时间需要10分钟。
%E2%80%9C%E5%8D%8F%E8%AE%AE%E8%A7%A3%E6%9E%90%E5%99%A8%E6%98%AF%E4%B8%80%E4%B8%AA%E6%8E%A5%E5%8F%A3%EF%BC%8C%E5%8F%AF%E4%BB%A5%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8D%8F%E8%AE%AE%E8%A7%A3%E6%9E%90%EF%BC%8C%E7%94%A8%E4%BA%8E%E8%A7%A3%E6%9E%90%E5%BC%80%E5%A4%B4%E5%BC%80%E5%A4%B9%E7%9A%84%E7%89%B9%E5%AE%9A%E5%8D%8F%E8%AE%AE%EF%BC%8C%E6%9C%AC%E8%B4%A8%E4%B8%8D%E6%98%AF%E5%8F%AF%E8%83%BD%E8%A2%AB%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%EF%BC%8C%E4%BD%86%E6%98%AF%E5%9C%A8%E5%BC%80%E5%A4%B4%E5%BC%80%E5%A4%B9%E4%B8%AD%E4%BD%BF%E7%94%A8%E7%9A%84%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%8A%A9%E6%95%BA%E6%9C%BA%E6%9E%B6%E6%9E%84%E5%AE%9E%E7%8E%B0%E8%BF%99%E4%B8%AA%E5%8A%9F%E8%83%BD%EF%BC%8C%E7%9B%B4%E6%8E%A5%E6%8E%A5%E5%8F%A3%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E4%BE%9D%E8%B5%96%E6%9E%84%E5%BB%BA%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E6%98%AF%E4%B8%80%E4%B8%AA%E5%8A%9F%E8%83%BD%E5%BC%95%E5%85%A5%E7%9A%84%E6%96%B9%E5%BC%8F%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8F%AF%E8%83%BD%E4%BD%BF%E7%94%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9E%84%E5%BB%BA%E6%9C%BA%E6%9E%84%EF%BC%8C%E4%BD%BF%E7%94%A8
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, 0, n));
}
System.out.println(out);
由此我们可以通过实现ProtocolResolver接口来定义我们自己的加载资源路径,也可以自定义自己加载资源路径的优先级。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

