好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

Spring资源管理(Resource).doc

5页
  • 卖家[上传人]:壹****1
  • 文档编号:516278046
  • 上传时间:2024-02-03
  • 文档格式:DOC
  • 文档大小:120KB
  • / 5 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • Spring资源管理(Resource)Spring为什么引入资源管理?Java中有各种各样的资源,资源的位置包括本地文件系统、网络、类路径等,资源的形式可以包括文件、二进制流、字节流等,针对不同的资源又有不同的加载形式本地文件系统中的文件在Java中使用File表示,使用FilelnputStream读取网络上的资源使用URL表示,使用URLConnection获取InputStream进行读取而类路径下的资源使用ClassLoader进行读取为了使用统一的方式访问资源,Spring将资源抽象为Resource,将资源的加载抽象为ResourceLoader°Spring配置文件的读取以及扫描包中的bean都会通过Resource访问资源资源抽象ResourceResource是Spring对资源抽象的一个接口,具体的资源可以有不同的实现类°Resource相关方法如下:publicinterfaceResourceextendsInputStreamSource{资源是否以物理的形式真实存在booleanexists();资源是否可以通过getInputStream()方法进行读取defaultbooleanisReadable(){returnexists();}资源是否已经被打开defaultbooleanisOpen(){returnfalse;}资源是否为文件系统中的资源defaultbooleanisFile(){returnfalse;}获取资源URL的表示形式URLgetURL()throwsIOException;获取资源URI的表示形式URIgetURI()throwsIOException;获取资源文件的表示形式FilegetFile()throwsIOException;获取资源Channel的表示形式defaultReadableByteChannelreadableChannel()throwsIOException{returnChannels.newChannel(getInputStream());}获取资源的内容长度longcontentLength()throwsIOException;获取资源最后修改的时间戳longlastModified()throwsIOException;创建一个位置相对于当前资源的资源ResourcecreateRelative(StringrelativePath)throwsIOException;获取资源的文件名称@NullableStringgetFilename();获取资源的描述信息StringgetDescription();Resource接口继承了接口InputStreamSource,InputStreamSource源码如下:publicinterfaceInputStreamSource{获取输入流InputStreamgetInputStream()throwsIOException;因此,每个Resource都可以获取到InputStream。

      常见的Resource如下面的类图所示每个Resource的实现都封装了具体的资源°Resource由AbstractResource进行主要的抽象实现,其子类可能根据封装的资源进行重写,由于源码比较简单,这里不再进行分析,感兴趣的朋友可以自行查看相关源码主要的Resource包括如下FileSystemResource:对文件系统中File及Path的封装,除了可以读取资源,还可以对资源进行写操作ClassPathResource:类路径下资源的封装UrIResource:URL资源的封装InputStreamResource:输入流资源的封装ByteArrayResource:字节数组的封装ServletContextResource:对Servlet上下文的封装资源加载抽象ResourceLoader与Java中的类加载相似,Java使用ClassLoader加载类,而Spring抽象出ResourceLoader加载Resource°ResourceLoader也是一个接口,根据不同的资源可以有不同的实现oResourceLoader源码如下:publicinterfaceResourceLoader{//类资源位置的前缀classpath:StringCLASSPATH_URL_PREFIX=ResourceUtils.CLASSPATH_URL_PREFIX;//根据指定的资源位置获取资源ResourcegetResource(Stringlocation);//获取当前类加载器中使用的ClassLoader@NullableClassLoadergetClassLoader();ResourceLoader中定义了根据资源位置获取资源的方法,相关类图见下图。

      DefaultResourceLoader是ResourceLoader的默认实现,其根据资源路径的协议进行解析为不同的Resource实现,但是它只能够根据资源路径获取一个Resource其获取资源的方法源码如下@OverridepublicResourcegetResource(Stringlocation){Assert.notNull(location,"Locationmustnotbenull");//先根据保存的协议解析器解析支持协议的资源for(ProtocolResolverprotocolResolver:getProtocolResolvers()){Resourceresource=protocolResolver.resolve(location,this);if(resource!=null){returnresource;}}//使用Class或ClassLoader获取资源if(location.startsWith("/")){returngetResourceByPath(location);}elseif(location.startsWith(CLASSPATH_URL_PREFIX)){//获取类路径下的资源returnnewClassPathResource(location.substring(CLASSPATH_URL_PREFIXlength()),getClassLoader());}else{try{//尝试获取URL资源//TrytoparsethelocationasaURL...URLurl=newURL(location);return(ResourceUtilsisFileURL(url)?newFileUrlResource(url):newUrlResource(url));}catch(MalformedURLExceptionex){//NoURLresolveasresourcepath.returngetResourceByPath(location);}}DefaultResourceLoader先根据协议解析器获取资源,因此我们可以定义自己的协议解析器解析自定义的协议的资源。

      如果路径以/开头,它会获取到一个ClassPathContextResource资源,否则如果以资源位置以classpath:开头,会获取到一个ClassPathResource资源,最后会尝试获取UrlResource资源如果想要根据资源路径的模式字符串获取多个Resource,则只能通过ResourcePatternResolver,ResourcePatternResolver源码如下publicinterfaceResourcePatternResolverextendsResourceLoader{//类路径下资源文件的前缀StringCLASSPATH_ALL_URL_PREFIX="classpath*:";//根据资源路径模式字符串获取资源Resource]]getResources(StringlocationPattern)throwsIOException;ResourcePatternResolver只有一个实现PathMatchingResourcePatternResolver,它会根据ant风格的路径去查找资源实现源码如下//ant风格的路径匹配privatePathMatcherpathMatcher=newAntPathMatcher();@OverridepublicResource]]getResources(StringlocationPattern)throwsIOException{Assert.notNull(locationPattern,"Locationpatternmustnotbenull");if(locationPattern.startsWith(CLASSPATH_ALL_URL_PREFIX)){//处理classpath*:开头类路径下的资源//aclasspathresource(multipleresourcesforsamenamepossible)if(getPathMatcher().isPattern(locationPattern.substring(CLASSPATH_AL」URL_PREFIXlength()))){//查询符合模式的资源//aclasspathresourcepatternreturnfindPathMatchingResources(locationPattern);}else{//查询不匹配模式的资源//allclasspathresourceswiththegivennamereturnfindAllClassPathResource$locationPattern.substring(CLASSPATH_ALL_URL_PREFIXlength。

      ));}}else{//处理非类路径下的资源//enerallonllooforapatternafteraprefixhere,//andonTomcatonlafterthe"*/"separatorforits"war:"protocol.intprefixEnd=(locationPattern.startsWith("war:")?locationPattern.indexOf("*/")+1:locationPattern.indexOf(':')+1);if(getPathMatcher().isPattern(locationPattern.substring(prefixEnd))){//查找匹配模式的资源//afilepatternreturnfindPathMatchingResources(locationPattern);}else{//查询不匹配模式的资源//asingleresourcewiththegivennamereturnnewResource]]{getResourceLoader().getResource(locationPattern)};}}获取资源时会先判断资源路径是否为类路径,然后再判断路径是否为支持的模式,默认支持ant风格的路径匹配,对类路径。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.