怎么理解Spring中的Resource与ResourceLoader体系


这篇文章主要介绍“怎么理解Spring中的Resource与ResourceLoader体系”,在日常操作中,相信很多人在怎么理解Spring中的Resource与ResourceLoader体系问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Spring中的Resource与ResourceLoader体系”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
这些Resources主要就分为2大类:只读,与可读可写。
从上面类图我们可以看出FileSystemResource,实现了WritableResource,因此仅有这个类属于可读可写,而其它的均属于只读的Resource.Resources接口在Resource接口中定义的方法,并不需要每一种实际资源类型都必须实现,各个实际资源类型根据自身的情况决定要实现哪些方法。例如基于文件的资源一般会实现getFile方法,而不是基于文件的资源则一般不实现getFile方法。对于大多数资源文件来说,不一定可写但一般是可读的。因此这里专门为可写的资源类型定义了WritableResource接口,此接口中定义了两个和写操作相关的方法:在Abstra 香港云主机ctResource的实现中,默认认为资源不能够表示为URL和File的形式,这样的资源如ByteArrayResource、InputStreamResource等都可以适应,因为这些资源类型底层并不是基于文件而是包装了字节数组或输入流而成,因此正对这种类型的操作,一般只支持读取操作。从上面的继承关系图中可以看到,FileSystemResource不但继承了AbstractResource还实现了WritableResource接口,也就是基于文件系统的资源类型,一般可以支持读写操作,当然一般也会支持相对路径资源。abstractFileResolvingResource表示需要通过解析URL来获取的资源。例如其exists方法的实现:并且他还有两个子类:UrlResource和ClassPathResouce,其中ClassPathResource类型是我们在Spring中非常常用的资源类型。UrlResource来说,基本上就是通过解析URL来完成相关的操作,只要符合URL规范的格式都可以表示为UrlResource对象。虽然ClassPathContextResource和ClassPathRelaticeContextResource都是继承自ClassPathResource,但是前者使用的ClassLoader来加载资源,后者使用的是Class来加载资源,二者还是有区别的:ClassLoader来加载资源,路径以类路径的根目录为基准(如WEB-INF/classes为基准)。Class来架子资源,资源以Class缩在的包路径为基准(如Web-INF/classes/com/test/resource/)Spring中对资源进行抽象,从而统一对资源操作的API,屏蔽不同资源之间的差异。使得其他组件可以不关心具体资源类型的实现,使用统一的API进行操作,并且通过不同的接口来分别定义资源的不同行为,然后通过抽象类的形式给出一个通用的实现,底层具体的实现只需要继承这个抽象类,并覆写跟当前资源类型需要特殊处理的方法即可。另外,在定义接口时,通过给出一对方法(如:isReadable和getInputStream)来分离条件检测和执行逻辑。
Spring中的Resource体系,只是对资源类型进行了抽象,统一了接口,但是如果需要使用不同类型的Resource的时候,还是得通过new具体资源类型的方式来获取。Spring中为了简化对Resource的查找和加载,提供了ResourceLoader来专门负责加载Resource,使用这不需要关心如何加载具体的资源,只需要给出资源的定义(schame),剩下的就交由ResourceLoader来处理了。ResourceLoader接口:从接口定义中看ResourceLoader最主要的行为就是getResource操作。getResource方法接收一个字符串类型参数,通过对字符串参数的解析和处理返回对应的Resource对象,这里的location参数可以包含一定的协议头或前缀来表明参数的来源信息。默认的实现DefaultResourceLoader,它可以使用ClassLoader作为参数进行创建。其getResource方法实现如下:对于传入的location参数,显示判断了是否包含classpath:前缀,如果包含则返回ClassPathResource对象,如果不是则通过解析URL的方式解析location参数,如果参数符合URL规范,则创建一个UrlResource,如果资源既不包含classpath:特殊前缀,也不是URL形式,那么就将其当做普通的资源路径传递给getResourceByPath进行处理:getResourceByPath返回ClassPathContextResource类型,实际上也可以也就是ClassPathResource。可以看出,ResourceLoader中并不判断资源是否真实存在和是否可读写,而仅仅通过解析出传入的location参数返回不同的Resource实现而已,资源是否存在,是否可读,需要调用方在拿到Resource对象后通过Resource提供的方法自行判断。Spring除了提供ResourceLoader之外,还提供了ResourcePatternResolver来扩充ResourceLoader。引进了一个新的前缀:classpath*:。和classpath:的差别就是,classpath*:可以搜索class path下所有满足条件的资源(包括同名的资源),而classpath:则只能返回一个资源(即使存在多个)。到此,关于“怎么理解Spring中的Resource与ResourceLoader体系”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注开发云网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: kafka客户端的使用方法

这篇文章主要介绍“kafka客户端的使用方法”,在日常操作中,相信很多人在kafka客户端的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”kafka客户端的使用方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!新的生…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 08/15 20:16
Next 08/15 20:16

相关推荐