关于Spring的资源问题

 
Spring给我们提供了一个Resource接口来统一访问底层资源。Resource接口继承InputStreamSource接口,提供了以下的方法: 

 exists:返回当前Resource代表的底层资源是否存在,true表示存在。

isReadable:返回当前Resource代表的底层资源是否可读,true表示可读。

         isOpen:返回当前Resource代表的底层资源是否已经打开,如果返回true,则只能被读取一次然后关闭以避免资源泄露;常见的Resource实现一般返回false。

         getURL:如果当前Resource代表的底层资源能由java.util.URL代表,则返回该URL,否则抛出IOException。

         getURI:如果当前Resource代表的底层资源能由java.util.URI代表,则返回该URI,否则抛出IOException。

         getFile:如果当前Resource代表的底层资源能由java.io.File代表,则返回该File,否则抛出IOException。

         contentLength:返回当前Resource代表的底层文件资源的长度,一般是值代表的文件资源的长度。

         lastModified:返回当前Resource代表的底层资源的最后修改时间。

         createRelative:用于创建相对于当前Resource代表的底层资源的资源,比如当前Resource代表文件资源“d:/test/”则createRelative(“test.txt”)将返回表文件资源“d:/test/test.txt”Resource资源。

         getFilename:返回当前Resource代表的底层文件资源的文件路径,比如File资源“file://d:/test.txt”将返回“d:/test.txt”,而URL资源http://www.javass.cn将返回“”,因为只返回文件路径。

         getDescription:返回当前Resource代表的底层资源的描述符,通常就是资源的全路径(实际文件名或实际URL地址)。


Resource接口提供了足够的抽象,足够满足我们日常使用。而且提供了很多内置Resource实现:ByteArrayResource、InputStreamResource 、FileSystemResource 、UrlResource、ClassPathResource、ServletContextResource、VfsResource等。

ByteArrayResource:isOpen()永远返回false,可以多次读取。

InputStreamResource: isOpen()返回true,只能一次读取。

FileSystemResource :isOpen()永远返回false,可以多次读取。

ClassPathResource : isOpen()永远返回false,可以多次读取。3种构造方法:

①: public ClassPathResource(String path)

②: public ClassPathResource(String path, ClassLoader classLoader)

③: public ClassPathResource(String path, Class<?> clazz)

        UrlResource: isOpen()永远返回false,可以多次读取。3种资源访问:

①:http:通过标准的http协议访问web资源,如new UrlResource(“http://地址”)

②:  ftp:通过ftp协议访问资源,如new UrlResource(“ftp://地址”)

③: file:通过file协议访问本地文件系统资源,如new UrlResource(“file:d:/test.txt”)


 ResourceLoader接口用于返回Resource对象;其实现可以看作是一个生产Resource的工厂类。

原理:getResource接口用于根据提供的location参数返回相应的Resource对象;而getClassLoader则返回加载这些Resource的ClassLoader。

DefaultResourceLoader能返回 ClassPathResource、UrlResource; 还提供一个用于web环境的ServletContextResourceLoader, 它继承了DefaultResourceLoader

的所有功能,又额外提供了获取ServletContextResource的支持。


注入Resource:

<bean id = "BeanName" class = "要注入的类 ">

<property name ="要注入类中的属性" value="资源路径"/>

</bean>

注入Resource数组:

<bean id = "BeanName" class = "要注入的类 ">

<property name ="要注入类中的属性>

<array> 

<value>"资源路径"</value>

<value>"资源路径"</value>

</array>

</property>

</bean>



使用路径通配符加载Resource:

“?”:匹配一个字符,如“config?.xml”将匹配“config1.xml”;

         “*”:匹配零个或多个字符串,如“cn/*/config.xml”将匹配“cn/javass/config.xml”,但不匹配匹配“cn/config.xml”;而“cn/config-*.xml”将匹配“cn/config-dao.xml”;

         “**”:匹配路径中的零个或多个目录,如“cn/**/config.xml”将匹配“cn /config.xml”,也匹配“cn/javass/spring/config.xml”;而“cn/javass/config-**.xml”将匹配“cn/javass/config-dao.xml”,即把“**”当做两个“*”处理。


“classpath*”: 用于加载类路径(包括jar包)中的所有匹配的资源。带通配符的classpath使用“ClassLoader”的“Enumeration<URLgetResources(String name)”方法来查找通配符之前的资源,然后通过模式匹配来获取匹配的资源。如“classpath:META-INF/*.LIST”将首先加载通配符之前的目录“META-INF”,然后再遍历路径进行子路径匹配从而获取匹配的资源。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值