`

spring 资源访问 Resource

阅读更多

  在jdk的api中,资源访问基本上都是通过URL类和IO来完成的,首先我们来介绍一下jdk中的资源访问

  在j2se中,我们一般通过ClassLoader的getResource()方法来定位查找资源:

 

	public static void main(String[] args) throws IOException, URISyntaxException {
		URL url = Thread.currentThread().getContextClassLoader().getResource("format.properties");
		Properties p = new Properties();
		p.load(url.openStream());
		System.out.println(p.get("chengan"));
		System.out.println(url.getProtocol());
	}

   ClassLoader的getResource()方法访问资源有一个限制,资源的位置只能在classpath路径下或者classpath的子路径下,如果format.properties文件的路径不在classpath路径下,getResource()方法是找不到文件的,比如我们再开发web项目的时候,jdbc.properties一般都会放到WEB-INF下新建一个文件保存,此时在使用ClassLoader获取,就获取不到,下面我们就需要使用servletContext提供的方法,getResource()方法参数可以使用"/"作为路径,比如format.properties位于classpath路径下的test包下(getResource()方法参数的起始路径为classpath):

URL url = Thread.currentThread().getContextClassLoader().getResource("test/format.properties");

  

  在j2ee中,可以使用ServletContext提供的方法getResource()来访问资源:

		response.setContentType("text/html");
		URL url = request.getSession().getServletContext().getResource("/WEB-INF/config/jdbc.properties");
		response.getWriter().print(url);

  jdbc.properties文件放在WEB-INF的config文件下,servletContext的getResource方法以WebRoot为起始路径,上面代码运行的结果为:

  jndi:/localhost/SpringDemo/WEB-INF/config/jdbc.properties

 

spring的资源访问提供了统一的接口:Resource

spring在设计上使用了策略模式,针对不同的资源访问,提供了不同的实现类,常用的实现类有:

UrlResource:对java.net.URL访问的封装

ServletContextResource:对servletContext访问资源的封装

FileSystemResource:访问文件系统资源的封装

InputStreamResource:流操作资源访问

ContextResource:该接口是对访问容器资源的接口,提供一系列实现该接口的类

 

在spring中,访问资源的入口在applicationContext中,applicationContext继承了ResourcePatternResolver接口

public interface ResourcePatternResolver extends ResourceLoader {

	String CLASSPATH_ALL_URL_PREFIX = "classpath*:";

	Resource[] getResources(String locationPattern) throws IOException;

}

 ResourcePatternResolver又继承了ResourceLoader接口:

public interface ResourceLoader {

	/** Pseudo URL prefix for loading from the class path: "classpath:" */
	String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX;


	Resource getResource(String location);

	ClassLoader getClassLoader();

}

 

在访问资源时,可以指定访问资源的方式:

	public Resource getResource(String location) {
		Assert.notNull(location, "Location must not be null");
                //常量CLASSPATH_URL_PREFIX值为:classpath:
		if (location.startsWith(CLASSPATH_URL_PREFIX)) {
			return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
		}
		else {
			try {
				// Try to parse the location as a URL...
				URL url = new URL(location);
				return new UrlResource(url);
			}
			catch (MalformedURLException ex) {
				// No URL -> resolve as resource path.
				return getResourceByPath(location);
			}
		}
	}

 上面是ResourceLoader的方法getResource()的默认实现,由上述代码可知,在指定资源的位置时,如果前缀指定为“classpath:",那么会使用ClassPathResource,否则默认使用UrlResource,如果出错会使用ClassPathResource

 

 

 

分享到:
评论

相关推荐

    spring资源访问

    ### Spring资源访问详解 #### 资源访问概述 在Spring框架中,资源访问是一个非常重要的功能,它为开发者提供了一种统一的方式去访问不同类型的资源(如文件、URL等)。这一特性使得开发者能够轻松地在不同的环境中...

    spring资源访问的一个例子

    在"spring资源访问的一个例子"中,可能包含了一个名为`testresource`的子文件夹。这通常表示该目录存放了与资源访问相关的测试文件,可能是HTML、CSS、图片或其他静态文件。为了使这些资源在打包后能够正常运行,...

    spring Resource管理详解

    Spring的Resource接口是访问资源的抽象,它提供了一种统一的资源访问方式,可以处理不同来源的资源,包括本地文件系统、类路径、URL等。Resource对象并不直接包含资源内容,而是提供了打开输入流、获取资源路径等...

    spring-resource

    `Resource`接口是Spring框架提供的一种抽象层,用于封装资源访问,它可以是本地文件系统中的文件,也可以是URL、类路径下的资源,甚至是JDBC数据源。通过`Resource`接口,开发者可以统一地处理不同来源的资源,提高...

    spring中的资源访问宝典

    在Spring框架中,资源访问是核心功能之一,它允许开发者高效、便捷地处理各种类型的资源,包括文件、网络、类路径等。本文将详细介绍Spring如何通过`Resource`接口及其实现类来简化资源的访问。 首先,传统的资源...

    Springboot访问Resource下的文件.pdf

    2. **访问Resource目录下的文件** 在Spring Boot中,我们可以使用`ClassPathResource`或`Resource`类来访问`src/main/resources`目录下的文件。例如,要读取一个名为`file.pdf`的PDF文件,可以这样做: ```java ...

    Springboot访问Resource下的文件.docx

    ### Spring Boot 访问 Resource 下的文件 #### 知识点一:Spring Boot 项目结构与 Resource 文件夹 在 Spring Boot 项目中,`src/main/resources` 文件夹用于存放项目的资源文件,包括配置文件、静态资源文件(如...

    spring resource code

    标题“spring resource code”指的是与Spring框架相关的源代码资源,这通常涉及到Java应用程序开发中的核心概念。Spring是一个开源的Java平台,它为构建企业级应用提供了全面的框架支持。Spring以其依赖注入...

    19 Spring MVC应用拓展Resource应用于文件下载慕课专栏1

    Resource接口是Spring提供的,用于抽象资源的访问,它可以是文件、URL、类路径下的资源等。通过Resource的实现类,如FileSystemResource或ClassPathResource,我们可以轻松地获取到文件的InputStream。 例如,对于...

    Spring的约束资源

    通过`@Secured`、`@PreAuthorize`等注解,可以控制对特定资源的访问。此外,Spring Security还支持OAuth2、JWT等现代安全协议。 6. **异常处理**:Spring MVC提供了统一的异常处理机制,我们可以通过定义`@...

    Spring实战之ServletContextResource访问资源文件示例

    在Spring框架中,`ServletContextResource` 是一个非常实用的类,它允许我们通过Servlet上下文(`ServletContext`)来访问Web应用中的资源文件。在实际的Web开发中,我们需要经常处理如XML配置文件、静态资源等文件...

    Spring Security OAuth2的resource_id配置和验证.docx

    总之,Spring Security OAuth2 的 resource_id 配置和验证机制是系统安全性和资源访问控制的关键部分。通过正确配置和验证 resource_id,可以确保客户端只能访问被明确授权的资源,从而提高系统的整体安全性。

    Spring实战之使用ClassPathResource加载xml资源示例

    在Spring框架中,`ClassPathResource`是一个非常重要的类,用于加载类路径(classpath)下的资源文件,如XML配置文件。在实际开发中,我们经常需要从类路径中读取这些资源来初始化bean或其他配置。本示例将详细介绍...

    spring资源文件

    综上所述,Spring资源文件的使用涉及到了Spring框架的多个核心概念,包括配置管理、资源加载、国际化、环境适应性等方面。理解并熟练掌握这些知识点对于有效地利用Spring进行企业级应用开发至关重要。在实际开发中,...

    Spring Boot项目打成jar包后,下载resources目录下文件为空的demo

    在Spring Boot应用中,资源文件(resources)是存放应用程序所需...正确配置应用、构建工具以及代码中的资源访问路径,通常能有效地解决这类问题。在实际开发中,确保进行充分的测试和调试,以确保所有功能的正常运行。

    基于Spring和Spring MVC实现可跨域访问的REST服务

    要解决跨域问题,Spring提供了CORS(Cross-Origin Resource Sharing)支持。默认情况下,浏览器阻止跨域请求,但我们可以配置Spring MVC来允许特定来源的请求。这通常通过`@CrossOrigin`注解实现,可以应用于...

    Spring security oauth源码

    同时,Sparklr2和Tonr2示例能帮助我们直观地看到OAuth流程的每个步骤,包括授权、令牌交换和资源访问。 在实际开发中,你可以根据这些源码学习如何自定义OAuth流程,例如实现自己的授权策略、令牌存储方式,或者...

    Spring实战之使用Resource作为属性操作示例

    在Spring中,我们可以使用Resource作为Bean的属性,从而实现对资源的访问和操作。 Resource的概念 在Spring中,Resource是对资源的抽象表示,可以是一个文件、一个URL或是一个输入流等。Resource接口提供了几个...

Global site tag (gtag.js) - Google Analytics