Resource

Spring的Resource接口代表底层外部资源,提供了对底层外部资源的一致性访问接口。

public interface Resource extends InputStreamSource {
boolean exists();
default boolean isReadable() { return this.exists(); }
default boolean isOpen() { return false; }
default boolean isFile() { return false; }
URL getURL() throws IOException;
URI getURI() throws IOException;
File getFile() throws IOException;
default ReadableByteChannel readableChannel() throws IOException {
return Channels.newChannel(this.getInputStream());
}
long contentLength() throws IOException;
long lastModified() throws IOException;
Resource createRelative(String var1) throws IOException;
@Nullable
String getFilename();
String getDescription();
}

Resource接口提供了足够的抽象,足够满足我们日常使用。而且提供了很多内置Resource实现:ByteArrayResource、InputStreamResource 、FileSystemResource 、UrlResource 、ClassPathResource、ServletContextResource、VfsResource等。

ByteArrayResource

	private final byte[] byteArray;
private final String description; return new ByteArrayInputStream(this.byteArray);

InputStreamResource

    private final InputStream inputStream;
private final String description;
private boolean read;

FileSystemResource

    private final String path;
@Nullable
private final File file;
private final Path filePath; return Files.newInputStream(this.filePath);

UrlResource

    @Nullable
private final URI uri;
private final URL url;
private final URL cleanedUrl; URLConnection con = this.url.openConnection();
return con.getInputStream();

ClassPathResource

    private final String path;
@Nullable
private ClassLoader classLoader;
@Nullable
private Class<?> clazz; if (this.clazz != null) {
is = this.clazz.getResourceAsStream(this.path);
} else if (this.classLoader != null) {
is = this.classLoader.getResourceAsStream(this.path);
} else {
is = ClassLoader.getSystemResourceAsStream(this.path);
}

ServletContextResource

代表web应用资源

    private final ServletContext servletContext;
private final String path; InputStream is = this.servletContext.getResourceAsStream(this.path);

VfsResource

代表虚拟文件系统资源

    private final Object resource;

    return VfsUtils.getInputStream(this.resource);

ResourceLoader接口

public interface ResourceLoader {
String CLASSPATH_URL_PREFIX = "classpath:";
Resource getResource(String var1);
@Nullable
ClassLoader getClassLoader();
}

对于目前所有ApplicationContext都实现了ResourceLoader,因此可以使用其来加载资源。

ClassPathXmlApplicationContext:不指定前缀将返回默认的ClassPathResource资源,否则将根据前缀来加载资源;

    // 第一类构造器是根据提供的配置文件路径使用“ResourcePatternResolver”
// 的“getResources()”接口通过匹配获取资源;即如“classpath:config.xml”
public ClassPathXmlApplicationContext(String configLocation)...
public ClassPathXmlApplicationContext(String... configLocations)...
public ClassPathXmlApplicationContext(String[] configLocations, @Nullable ApplicationContext parent)...
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh)...
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)... // 第二类构造器是根据提供的路径和clazz来构造ClassResource资源。
// 即采用“public ClassPathResource(String path, Class<?> clazz)”构造器获取资源。
public ClassPathXmlApplicationContext(String path, Class<?> clazz)...
public ClassPathXmlApplicationContext(String[] paths, Class<?> clazz)...
public ClassPathXmlApplicationContext(String[] paths, Class<?> clazz, @Nullable ApplicationContext parent)...

FileSystemXmlApplicationContext:不指定前缀将返回FileSystemResource,否则将根据前缀来加载资源;

	// 将加载相对于当前工作目录的“configLocation”位置的资源
// 在linux系统上不管“configLocation”是否带“/”,都作为相对路径
// 在window系统上如“D:/resourceInject.xml”是绝对路径。
// 因此在除非很必要的情况下,不建议使用该ApplicationContext。
public FileSystemXmlApplicationContext(String configLocation)...
public FileSystemXmlApplicationContext(String... configLocations)...
public FileSystemXmlApplicationContext(String[] configLocations, ApplicationContext parent)...
public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh)...
public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)...

WebApplicationContext:不指定前缀将返回ServletContextResource,否则将根据前缀来加载资源;

其他:不指定前缀根据当前上下文返回Resource实现,否则将根据前缀来加载资源。

spring(四):Resource的更多相关文章

  1. Spring注解 @Resource和@Autowired

    @Resource和@Autowired两者都是做bean的注入使用.其实@Resource并不是Spring的注解,他的包是javax.annotation.Resource 需要导入.但是Spri ...

  2. Spring注解@Resource和@Autowired区别对比、spring扫描的默认bean的Id、程序获取spring容器对象

    -------------------------注解扫面的bean的ID问题-------------------------- 0.前提需要明白注解扫描出来的bean的id默认是类名首字母小写,当 ...

  3. Spring Security Resource Server的使用

    Spring Security Resource Server的使用 一.背景 二.需求 三.分析 四.资源服务器认证流程 五.实现资源服务器 1.引入jar包 2.资源服务器配置 3.资源 六.测试 ...

  4. Spring注解@Resource和@Autowired区别对比

    转载:http://www.cnblogs.com/think-in-java/p/5474740.html @Resource和@Autowired都是做bean的注入时使用,其实@Resource ...

  5. Spring 注解 @Resource和@Autowired(转)

    鸣谢:http://my.oschina.net/u/216467/blog/205951 @Resource和@Autowired两者都是做bean的注入使用. 其实@Resource并不是Spri ...

  6. Spring 注解 @Resource和@Autowired

    @Resource和@Autowired两者都是做bean的注入使用. 其实@Resource并不是Spring的注解,他的包是javax.annotation.Resource 需要导入.但是Spr ...

  7. Spring注解@Resource和@Autowired的区别

    @Resource和@Autowired都是用来做bean的依赖注入的,两者都可以写在字段和setter方法上. java为我们提供了 javax.annotation.Resource这个注解. s ...

  8. 【转载】Spring注解@Resource和@Autowired区别对比

    @Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Sprin ...

  9. 【Java】Spring之Resource(三)

    Java的各种URL前缀的标准类和标准处理程序不足以完全访问低级资源.例如,没有URL可用于访问需要从类路径或相对于a获取的资源的标准化实现 ServletContext.虽然可以为专用URL 前缀注 ...

  10. spring四种依赖注入方式(转)

    spring四种依赖注入方式!! 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提 ...

随机推荐

  1. day5 dict嵌套

    #!/usr/bin/env python # -*- coding:utf-8 -*- dic = { 'name': ['alex', 'wusir', 'taibai'], 'py9': { ' ...

  2. 《javascript正则表达式迷你书》笔记

    字符匹配攻略 横向匹配--通过量词 {m,n} {m,} {m} ? + * 贪婪匹配 后面跟?号 惰性匹配 纵向匹配--通过字符组 \d \D \w \W \s \S . \w表示[0-9a-zA- ...

  3. nodeJS菜鸟教程笔记

    http模块 var http = require('http'); // 引入http模块 var url = require('url'); // 引入url模块 var querystring ...

  4. Python之xlrd模块读取xls文件与报错解决

    安装 pip3 install xlrd 用法 Sheet编号从0开始 rows,colnum编号均从0开始 合并的单元格仅返回第一格内容 Sheets只能被调用一次,可获取所有sheet取idx 无 ...

  5. The sklearn preprocessing

    Recently, I was writing module of feature engineering, i found two excellently packages -- tsfresh a ...

  6. 性能优化-css,js的加载与执行

    前端性能优化 css,js的加载与执行 javascript是单线程的 一个网站在浏览器是如何进行渲染的呢? html页面加载渲染的过程 html渲染过程的一些特点 顺序执行,并发加载 词法分析 并发 ...

  7. django csrf 中间件

    CSRF和中间件 CSRF使用 说明csrf存在cookie中 全局使用 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', ...

  8. [Python]BeautifulSoup安装与使用

    1.BeautifulSoup简介 BeautifulSoup4和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据 ...

  9. ASP.NET MVC简单流程解释(传值方式)

    在上篇笔记里我们创建了一个简单的MVC程序 在view中,@Model指的就是MyFirstMvc.Models.IndexModel,我们的提交页面是/Test/Index,当我们输入完数字并按下提 ...

  10. Wannafly Camp 2020 Day 2J 邦邦的2-SAT模板

    #include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; cout<<n& ...