美文网首页程序员SpringFramework
Spring IOC 学习二 之资源加载

Spring IOC 学习二 之资源加载

作者: ystwo | 来源:发表于2019-03-11 17:15 被阅读4次

    第一篇:Spring IOC学习一

    统一资源加载


    上一篇文章介绍 Resource体系中就可以看到Spring IOC的资源定位 和 加载都在这个体系中完成。

    org.springframework.core.io.Resource 是Spring的资源访问接口,其继承org.springframework.core.io.InputStreamSource 接口 。Resource 作为所有资源的抽象接口,其子类实现了统一的通用方法。

    Resource 资源定位 详细代码


    AbstractResource 实现了所有的接口:


                   该截图只显示了部分接口的实现

    Resource 资源定位体系 结构:


    有上图可以看出整个Sping IOC中的Resource体系的大致结构

    1、*Resource所有的类和接口最终来源InputStreamSource。

    2、Resource定义的接口都有抽象类AbstractResource实现。

    3、Spring根据不同的资源情况提供了具体的实现:

            a、* FileSystemResource:对 java.io.File类型资源的封装,只要是跟 File 打交道的,基本上与 FileSystemResource 也可以打交道。支持文件和 URL 的形式,同时实现 WritableResource 接口,且从 Spring Framework 5.0 开始,FileSystemResource 使用NIO.2 API进行读/写交互。

            b、*ByteArrayResource:对字节数组提供封装。如果通过 InputStream 形式访问该类型的资源,该实现会根据字节数组的数据构造一个相应的 ByteArrayInputStream。

            c、UrlResource是对 java.net.URL类型的资源提供封装,内部委派URL进行具体的资源操作。

            d、ClassPathResource 是对classspath 类型的资源的提供封装,使用默认的classloader或给定的Class来加载资源。

            e、InputStreamResource 将给定的 InputStream 作为一种资源的 Resource 的实现类


    Resource 已经将资源定位了,那就需要进行将资源进行加载,而资源的加载就需要ResourceLoader来完成,ResourceLoader是资源加载的超级接口。

    该超级接口包含了2个重要方法

    1、Resource getResource(String location);

        根据传入的location不同的内容实现不同的资源加载类型如:URL类型的资源“file:C:/....txt”,ClassPath类型“classpath:...txt”,相对资源类型“/...txt”;(该方法没有校验Resource资源是否真实存在,需要调用 exit()方法进行验证)

    2、ClassLoader getClassLoader();

        获取资源的加载器,如果实现类中有给定的实现类则返回,没有的话则返回系统默认的ClassUtils.getDefaultClassLoader()

    ResourceLoader超级接口最重要的2个实现类:

    1、DefaultResourceLoader :该类是实现了单个的资源加载方式,如果有多个资源需要加载不能通过通配符批量加载,只能多次加载。

    2、PathMatchingResourcePatternResolver:该方法可以说是上面的升级既可以通配符批量加载也可以单个加载。  

    DefaultResourceLoader 

        1、获取ClassLoader实例如果没有指定就返回系统默认实现的ClassLoader 如图:

        2、getResource(String location)核心代码

    如上代码:

        首先:使用ProtocolResolver 进行资源加载,如果成功则直接返回

        其次:如果ProtocolResolver 资源加载不成功则进行下一步加载模式

            a、如果是相对路径"/"开头,则调用getResourceByPath(location);

            b、如果classpath: 开头的路径则调用 classPathResource()方式

            c、如果以上都不是先判断是否是URL模式的,如果是万事大吉。如果不是跑出异常后则用默认资源加载方式getResourceByPath(location)

    这段代码会返回几个true?为什么?

    这是因为上面说到的,a,b,c这种方式都不适合。所以如果我们想要FileSystemResource 资源类型的话就用FileSystemResourceLoader

    PathMatchingResourcePatternResolver 支持匹配模式资源加载


    三个构造方法,如果指定返回指定的,如果不指定则返回系统默认

    返回多个加载资源的核心方法

    其中 findPathMatchingResources 和 findAllClassPathResources 方法最核心,以及它们下面的 doFindAllClassPathResources和doFindPathMatchingJarResources、findMatchingResources方法。

    相关文章

      网友评论

        本文标题:Spring IOC 学习二 之资源加载

        本文链接:https://www.haomeiwen.com/subject/dbcbpqtx.html