Spring IOC 学习二 之资源加载

时间:2024-05-30 15:40:42

第一篇:Spring IOC学习一

统一资源加载


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

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

Resource 资源定位 详细代码


Spring IOC 学习二 之资源加载

AbstractResource 实现了所有的接口:


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

Spring IOC 学习二 之资源加载

Resource 资源定位体系 结构:


 

Spring IOC 学习二 之资源加载

有上图可以看出整个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()

Spring IOC 学习二 之资源加载

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

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

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

DefaultResourceLoader 

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

Spring IOC 学习二 之资源加载

    2、getResource(String location)核心代码

Spring IOC 学习二 之资源加载

如上代码:

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

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

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

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

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

 

Spring IOC 学习二 之资源加载

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

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

 

PathMatchingResourcePatternResolver 支持匹配模式资源加载


 

Spring IOC 学习二 之资源加载

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

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

Spring IOC 学习二 之资源加载

Spring IOC 学习二 之资源加载

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