第一篇: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方法。
网友评论