在讲解如何支持之前,有必要先说明白对Spring而言,Resources是什么以及如何处理不当会发生什么问题;

好的,先说Resources是什么?大家都知道Spring容器在启动的时候会加载各种各样的配置文件,这些个用于不同目的的配置文件,就可以称之为Resources(至于中文翻译成什么,个人一直没有合适的选择),而且这些配置文件可能来源某个URL地址,项目的类路径,某个文件系统,ServletContext环境中,甚至来源于二进制文件以及某些其它的输入流,那么由于Resources的来源这么广泛,一旦处理来源不当,就会引发各种文件不存在或找不到异常,比如今天在论坛里面看到一个小伙伴的这个异常,部分异常信息如下:

org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [springmvc.xml]; nested exception is java.io.FileNotFoundException: class path resource [springmvc.xml] cannot be opened because it does not exist

JDK只提供了如java.net.URL、File等,缺少从类路径或者Web容器上下文中获取资源的操作类等,正因为如此,Spring框架提供了一个更为可靠的接口Resource用来抽象规范各种来源的资源,接口代码如下:

public interface Resource extends InputStreamSource {boolean exists();boolean isReadable();boolean isOpen();URL getURL() throws IOException;URI getURI() throws IOException;File getFile() throws IOException;long contentLength() throws IOException;long lastModified() throws IOException;Resource createRelative(String relativePath) throws IOException;String getFilename();String getDescription();}
public interface InputStreamSource {InputStream getInputStream() throws IOException;}

Spring框架提供了大量的对上述Resourse接口的实现类,来满足不同来源的Resource

1、UrlResource:这个类里面包装了java.net.URL,可以用来访问任何可以通过URL访问的对象,比如各类文件、HTTP目标以及FTP目标对象等;

2、ClassPathResource:该类代表了可以从类路径下面获取的Resource;

3、FileSystemResource:该类是java.io.File类处理的Resource实现,显然它可以支持File和URL;

4、ServletContextResource:该类是ServletContext资源的实现,它负责以相对于Web应用根目录的路径加载资源;

5、InputStreamResource:对应一个InputStream资源;

6、ByteArrayResource:二进制数组表示的资源,二进制数组资源可以在内存中通过程序构造;

和ByteArrayResource:这两者用的较少,只有在即特殊场合下才使用,就不做叙述;

既然有这么多种资源,访问不同类型的资源,必须使用相应的Resource实现类,这是比较麻烦的,对此Spring框架提供了一个ResourceLoader接口,该接口代码如下:

public interface ResourceLoader {/** Pseudo URL prefix for loading from the class path: "classpath:" */String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX;Resource getResource(String location);ClassLoader getClassLoader();}

它可以根据一个资源地址加载文件资源,那么这个资源地址是什么格式的呢?以下是从某本书上的截图


这个时候,我们会发现只要是前缀指定好,Spring会解析这个资源地址,自动去指定地方加载资源,这就要求我们在指定资源路径的时候一定确定好想要加载的资源到底是什么类型的资源,否则就会报各种找不到的异常,这样一来就解决了咱们在文章开头提到的问题。

需要说明的是,比如与"classpath:"对应的,还有一种"classpath*:"的前缀;假设有多个jar包或文件系统类路径都拥有一个相同的包名(如com.springframewok)前者只会加载第一个加载的com.springframework包下查找,而后者会扫描所有的这些jar包和文件系统类路径下面的内容;

上述ResourceLoader接口只支持带资源类型前缀的表达式,不支持Ant风格的资源路径表达式,ResourcePaternResolver扩展了ResourceLoader接口,

public interface ResourcePatternResolver extends ResourceLoader {/*** Pseudo URL prefix for all matching resources from the class path: "classpath*:"* This differs from ResourceLoader's classpath URL prefix in that it* retrieves all matching resources for a given name (e.g. "/beans.xml"),* for example in the root of all deployed JAR files.* @see org.springframework.core.io.ResourceLoader#CLASSPATH_URL_PREFIX*/String CLASSPATH_ALL_URL_PREFIX = "classpath*:";/*** Resolve the given location pattern into Resource objects.* <p>Overlapping resource entries that point to the same physical* resource should be avoided, as far as possible. The result should* have set semantics.* @param locationPattern the location pattern to resolve* @return the corresponding Resource objects* @throws IOException in case of I/O errors*/Resource[] getResources(String locationPattern) throws IOException;}

该接口定义了一个新的接口方法:getResources(String locationPattern),该方法支持带资源类型前缀及Ant风格的资源路径表达式,由于Spring所有的ApplicationContext实现类都直接或间接地实现了该接口,所以我们可以在Spring配置文件中方式使用。 Ant风格的资源地址,支持3种匹配符;

  • ?:匹配文件名中的一个字符;
  • * :匹配文件名中的任意个字符
  • **:匹配多层路径

下面是几个示例:

  • classpath:com/ssh/t?st.xml:匹配com/ssh路径下的com/ssh/test.xml、com/ssh/tast.xml等
  • file:D:/conf/*Config.xml:匹配文件系统D:/conf路径下的所有文件以Config.xml为后缀的文件,比如匹配HibernateConf.xml,SpringConf.xml等;
  • classpath:com/**/test/xml:匹配com类路径下(当前目录及其子孙目录)的test.xml文件,比如匹配:com/a/test.xml、com/a/b/c/d/test.xml等

只要是理解好了3种匹配符的作用,后续地使用没有问题,通过上面的说明,我们可以得出:只要是在Spring管理的环境配置中,可以放心大胆的按照上述规则制定各种资源文件

Spring对不同来源的Resources的支持相关推荐

  1. java spring boot缓存_Springboot对缓存的支持

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 缓存是依赖于org.springframework.cache.Cache和 org.springframework.cache.CacheManager ...

  2. Spring 5.0 GA版本发布,支持JDK9及反应式编程

    Spring Framework 5.0耗时两年,终于在9月28日通过Spring官方博客撰文宣告发布第一个GA版本.期间经历1年多的里程碑版本和数个RC版本,现在 5.0.0.RELEASE已正式发 ...

  3. Spring IOC 依赖来源-8

    Spring IOC 依赖来源 自定义Bean UserRepository userRepository = beanFactory.getBean("userRepository&quo ...

  4. 安卓微信修改分享来源,小尾巴,支持qq 头条 uc 浏览器

    安卓微信修改分享来源,小尾巴,支持qq 头条 uc 浏览器   需要联系QQ 2479092628 这样可以提高分享点击率,也可以防止微信检测,做到防封效果 部分效果展示 跨端应用也可使用, 有成熟的 ...

  5. Spring Boot 2.3.0 发布:支持Java14、打包Docker镜像、优雅关机配置...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 冷冷gg 来源 | https://www.oschin ...

  6. Spring Boot 对基础 Web 开发的支持(下)2-2

    接着上一课我们继续讲解. 数据校验 在很多时候,当我们要处理一个应用程序的业务逻辑时,数据校验是必须要考虑和面对的事情.应用程序必 须通过某种手段来确保输入进来的数据从语义上来讲是正确的.在 Java ...

  7. 基于Spring可扩展Schema提供自定义配置支持(spring配置文件中 配置标签支持)

    2019独角兽企业重金招聘Python工程师标准>>> spring使用了这么长时间, 你真的了解spring bean加载的机制吗? 这个是我们项目中最常见的配置文件中的内容配置, ...

  8. Spring保存文件到MongoDB之GridFS支持

    为什么80%的码农都做不了架构师?>>>    问题 Spring上传来的文件,怎么保存到MongoDB中去类,这里暂时不考虑其他方案来保存文件,如文件系统,FTP等等之类的.假设, ...

  9. Spring Boot中静态文件获得Thymeleaf支持(配置porm.xml)

    目录 理论 演示 理论 当把静态文件放到templates时,能获取模板的支持,但需要配置好对应的porm.xml才能得到支持,不然总是访问404. 演示 如下项目结构: 如下templates中有如 ...

最新文章

  1. ACL 2018最佳论文公布!计算语言学最前沿研究都在这里了
  2. Hey, everybody!
  3. 【jzoj3734,Usaco2014Open银组】双导航(gpsdual)
  4. python代码性能分析_使用memory_profiler对代码进行性能分析会增加执行时间
  5. 图解 MongoDB 地理位置索引的实现原理
  6. 不止操作系统,智能手机才更需要开源!
  7. ubuntu 关闭IPv6
  8. 云端深度学习框架TensorFlow读取数据IO的高效方式
  9. 人生每一件事都是为自己而做
  10. Jenkins使用教程
  11. Eclipse中使用SVN Eclipse配置SVN
  12. 【网络存储】存储区域网络SAN
  13. 复联4定档 4.24——十一年21部漫威电影,用数据为你梳理口碑、票房、主演最佳......
  14. BJFU_数据结构习题_274六度空间理论
  15. 签了工作之后才发现,自己太草率了  很长很真实 但会对你有所帮助的
  16. meta中的http-equiv = X-UA-Compatible
  17. 【一文读懂】python 中的 numpy.reshape(a, newshape, order=‘C‘) 详细说明及实例讲解
  18. 【论文】论文阅读记录
  19. 浅尝springboot
  20. 在网易有数上做数据加工和数据分析的实践

热门文章

  1. I - Defeat the Enemy UVALive - 7146 二分 + 贪心
  2. angularjs项目的页面跳转如何实现
  3. 【转】通过身边小事解释机器学习是什么?
  4. Hihocoder 最近公用祖先三 在线LCA
  5. 寒江的网站基本优化观点
  6. [ES6] 细化ES6之 -- 对象的扩展
  7. Vue「五」—— 动态组件、插槽、自定义指令
  8. 数字滤波器(六)--设计FIR滤波器
  9. panda 函数笔记(merge\DataFrame用法\DataFrame.plot)
  10. android屏幕录制鸿洋,Android之自定义View笔记(鸿洋)