Spring中的resource

我们先看看类之间的关系

注意我们的application是间接继承了resourceloader的,也就是说我们的application其实就是一个resourceloader

我们再看看这个类的继承,发现了,classpathxml这个对象实际上也是从最开始的resourceloader来的

那么我们加载application资源的时候,可以有2种方式:

ResourceLoader resourceLoader = new ClassPathXmlApplicationContext("classpath:applicationContext-bean.xml");
//第二种方式
ResourceLoader resourceLoader2 = new FileSystemXmlApplicationContext("classpath:applicationContext-bean.xml");

都是可以的哈,都是可以的!!!

那这个resourceloader有什么用???

关键就是那个getResource(String)方法,获取资源

自然而然,我们会想,这个能获取什么资源,怎么去获取资源,嗯。。。

具体怎么获取我们继续看书。。。

在搞清除怎么获取资源之前,我们想一下如何去获取这个resourceloader,如果我们每次获取都要用new ClassPathXmlApplicationContext或者new FileSystemXmlApplicationContext

获取这个对象的方法spring也有提供,我们只要实现ResourceLoaderAware或者ApplicationContextAware就可以实现了(因为applicationContext也是resourceloader的一种,参考上面的UML图

Public class FooBar implements ResourceLoaderAware {

    //资源加载器
private ResourceLoader resourceLoader; public void foo(String location) {
//这里有没有很熟悉
// ResourceDemo.class.getResource(location).getClass()
System.out.println(this.getResourceLoader().getResource(location).getClass());
} @Override
public void setResourceLoader(ResourceLoader resourceLoader) {
//这里进行resourceloader的注入
this.resourceLoader = resourceLoader;
} public ResourceLoader getResourceLoader() {
return resourceLoader;
} } Public class FooBar2 implements ApplicationContextAware { //资源加载器
private ResourceLoader resourceLoader; public void foo(String location) {
//这里有没有很熟悉
// ResourceDemo.class.getResource(location).getClass()
System.out.println(this.getResourceLoader().getResource(location).getClass());
} public ResourceLoader getResourceLoader() {
return resourceLoader;
} @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// TODO Auto-generated method stub
//这里进行resourceloader的注入
this.resourceLoader = applicationContext;
} }

然后我们需要在对应的配置文件中配置好这个bean,那spring就会自动为这个bean注入resource了

<bean id="fooBar" class="cn.cutter.start.resourceloader.FooBar" />

<bean id="fooBar2" class="cn.cutter.start.resourceloader.FooBar2" />

好吧,看到这里是不是有点晕了,到底resourceloader和resource是什么玩意???

我们先放下书,冷静一下,想一下这到底是个啥玩意,有啥作用???

前面resourceloader我们看到了可以用来加载资源,可以加载spring配置文件,那么resource呢?

我们的resource是可以通过resourceloader中的get方法获取,那么不同的resourceloader是不是会获取到不同的resource呢?

我们先从默认的defaultresourceloader方法看起

这个类也很光棍,既然要返回那么就直接返回resource算了,反正也是接口实现的

那么我们可以看看可以返回那些resource,是不是不同的策略可以返回不同的resource

ClassPathResource可用来获取类路径下的资源文件。假设我们有一个资源文件test.txt在类路径下,我们就可以通过给定对应资源文件在类路径下的路径path来获取它,new ClassPathResource(“test.txt”)。

FileSystemResource可用来获取文件系统里面的资源。我们可以通过对应资源文件的文件路径来构建一个FileSystemResource。FileSystemResource还可以往对应的资源文件里面写内容,当然前提是当前资源文件是可写的,这可以通过其isWritable()方法来判断。FileSystemResource对外开放了对应资源文件的输出流,可以通过getOutputStream()方法获取到。

UrlResource可用来代表URL对应的资源,它对URL做了一个简单的封装。通过给定一个URL地址,我们就能构建一个UrlResource。

ByteArrayResource是针对于字节数组封装的资源,它的构建需要一个字节数组。

ServletContextResource是针对于ServletContext封装的资源,用于访问ServletContext环境下的资源。ServletContextResource持有一个ServletContext的引用,其底层是通过ServletContext的getResource()方法和getResourceAsStream()方法来获取资源的。

InputStreamResource是针对于输入流封装的资源,它的构建需要一个输入流。

可以看得出来,这类resource可以看成相应的资源,借助java的io流,我们可以获取对应的资源的输入流,那么通过io流就就可以获取到对应的资源,不论是类,文件,还是字节流,都可以看成不同的资源

那么这些跟spring有什么关系呢???

我们实体操作一个

package cn.cutter.start.resourceloader;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; import org.springframework.core.io.Resource; /**
* 用来测试spring的统一资源加载策略
* @author xiaof
*
*/
public class ResourceDemo { private Resource resource; public void printContent() {
if (resource != null && resource.exists()) {
if (resource.isReadable()) {
InputStream is;
try {
is = resource.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
if (is != null) {
is.close();
}
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
} public void setResource(Resource resource) {
this.resource = resource;
} }

Spring配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <context:component-scan base-package="cn.cutter" /> <bean id="ttmRateService" class="cn.cutter.simplefx.service.impl.MockTTMRateServiceImpl"></bean> <bean id="fooBar" class="cn.cutter.start.resourceloader.FooBar" /> <bean id="fooBar2" class="cn.cutter.start.resourceloader.FooBar2" /> <bean id="resourceDemo" class="cn.cutter.start.resourceloader.ResourceDemo">
<property name="resource">
<value>classpath:applicationContext-bean.xml</value>
</property>
</bean> </beans>

测试案例:

@Test
public void testPrintContext() {
ApplicationContext ctx = before(); ResourceDemo resourceDemo = (ResourceDemo) ctx.getBean("resourceDemo"); resourceDemo.printContent(); }

结果展示:

我们看得到,这个资源其实就是输出这个文件流内容。

【sping揭秘】6、IOC容器之统一资源加载策略的更多相关文章

  1. 【死磕 Spring】----- IOC 之 Spring 统一资源加载策略

    原文出自:http://cmsblogs.com 在学 Java SE 的时候我们学习了一个标准类 java.net.URL,该类在 Java SE 中的定位为统一资源定位器(Uniform Reso ...

  2. 【死磕 Spring】—— IoC 之 Spring 统一资源加载策略

    本文主要基于 Spring 5.0.6.RELEASE 摘要: 原创出处 http://svip.iocoder.cn/Spring/IoC-load-Resource/ 在学 Java SE 的时候 ...

  3. ios资源加载策略

    做了好几个月的ios,大框架都是别人搭好的,自己只是实现逻辑,很是失落.慢慢开始整理学习一些概念类的东西吧,希望自己能提高点. cocos2d-x从cocos2d-2.0-x-2.0.2开始,考虑到自 ...

  4. spring源码解析之IOC容器(二)------加载和注册

    上一篇跟踪了IOC容器对配置文件的定位,现在我们继续跟踪代码,看看IOC容器是怎么加载和注册配置文件中的信息的.开始之前,首先我们先来了解一下IOC容器所使用的数据结构-------BeanDefin ...

  5. Spring源码之IOC容器创建、BeanDefinition加载和注册和IOC容器依赖注入

    总结 在SpringApplication#createApplicationContext()执行时创建IOC容器,默认DefaultListableBeanFactory 在AbstractApp ...

  6. Spring IoC容器 XML 配置与加载

    IoC 容器 XML 配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...

  7. 小白都能看懂的Spring源码揭秘之IOC容器源码分析

    目录 前言 IOC 只是一个 Map 集合 IOC 三大核心接口 IOC 初始化三大步骤 定位 加载 注册 总结 前言 在 Spring 框架中,大家耳熟能详的无非就是 IOC,DI,Spring M ...

  8. Cocos Creator 资源加载流程剖析【二】——Download部分

    Download流程的处理由Downloader这个pipe负责(downloader.js),Downloader提供了各种资源的"下载"方式--即如何获取文件内容,有从网络获取 ...

  9. Away3D引擎学习笔记(一)资源加载解析块

    前文:Away3D断断续续用了一段时间了,三维相关的很多算法,计算转换还是有点绕,整理些自己觉得还有点意思东西,希望大家有用. 三维开始,Away3D构架你场景那几行代码各处都有,这里就不copy了, ...

随机推荐

  1. Java基础之多线程没那么复杂!

    多线程的引入 1.什么是多线程 线程是程序执行的一条路径,一个进程中可以包含多条线程;多线程并发执行可以提高程序的效率</br> 2.进程和线程之间的关系 操作系统可以同时执行多个任务,每 ...

  2. Vue自定义指令报错:Failed to resolve directive: xxx

    Vue自定义指令报错 Failed to resolve directive: modle 这个报错有2个原因: 1.指令单词拼错 2.Vue.directive() 这个方法没有写在 new Vue ...

  3. boost-实用工具:noncopyable、optional、assign

    1.noncopyable 让一个类从noncopyable继承可以实现禁止对象的复制,使用需要包含头文件"boost/noncopyable.hpp"或"boost/u ...

  4. 利用url传多个参数

    刚开始接触jsp,比较偏向于用button标签的onclick方法进行页面的跳转.但是关于页面跳转的各种问题真是叫人头大,以下记录,仅仅为自己以后查看. Qone 用url传参的时候遇到中文怎么办 编 ...

  5. Apache 2.4.28的安装

    Apache 2.4.28的安装 1.安装Apache 1.1下载Apache网址:http://httpd.apache.org/ [root@localhost ~]# mkdir -p /roo ...

  6. crontab和crond分析

    目录 目录 1 1. 研究目的 1 2. 基本概念 1 3. crontab 1 3.1. 编辑 2 3.1.1. "crontab -e"工作流 2 3.2. 问题 3 4. c ...

  7. C++中的public、protected 及 private 用法

    首先需要明白几点: 1,类的一个特性就是封装,public 和 private 作用就是实现这一目的的. 用户代码(类外)可以访问public成员而不能访问private成员:private成员只能由 ...

  8. 20169207《Linux内核原理与分析》第六周作业

    这周的作业同样分为两部分,第一部分的学习MOOC第四节[扒开系统调用的三层皮],并结合实验楼的实验四深入学习.第二部分阅读学习教材「Linux内核设计与实现 (Linux Kernel Develop ...

  9. Codeforces822 A I'm bored with life

    A. I'm bored with life time limit per test 1 second memory limit per test 256 megabytes input standa ...

  10. 《mysql必知必会》学习_第八章_20180730_欢

    第八章学习LIKE操作符,百分百(%)通配符,下划线(_)通配符 P47 select prod_id,prod_name from products where prod_name LIKE 'je ...