`

Spring.ResourceLoader

 
阅读更多




 
 

 



 

DefaultResourceLoader

ResourceLoader接口的默认实现,通过参数资源路径的前缀获得相应的Resource.

1、若以"classpath:"开头,则获得classPathResource

2、若location符合URL格式,如http:,ftp:,file:,jar等,则获得URLResource

3、1,2都不符合,表示无前缀或其他,则尝试getResourceByPath()方法获得Resource(默认:ClassPathContextResource)。子类通过getResourceByPath方法获得不同的Resource。如FileSystemXMLApplicationContext

 

DefaultResourceLoader代码:

 

	public Resource getResource(String location) {
		Assert.notNull(location, "Location must not be null");
		if (location.startsWith(CLASSPATH_URL_PREFIX)) {
//1.若以"classpath:"开头,则表示使用classPathResource加载
			return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
		}
		else {
			try {
//2.尝试是否符合URL格式,如http:,ftp:,file等
				// 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.
//3.不符合URL格式,则采用自定义形式加载。方法可子类覆盖,默认ClassPathContextResource
				return getResourceByPath(location);
			}
		}
	}

 

 

	/**
	 * Return a Resource handle for the resource at the given path.
	 * <p>The default implementation supports class path locations. This should
	 * be appropriate for standalone implementations but can be overridden,
	 * e.g. for implementations targeted at a Servlet container.
	 * @param path the path to the resource
	 * @return the corresponding Resource handle
	 * @see ClassPathResource
	 * @see org.springframework.context.support.FileSystemXmlApplicationContext#getResourceByPath
	 * @see org.springframework.web.context.support.XmlWebApplicationContext#getResourceByPath
	 */
	protected Resource getResourceByPath(String path) {
		return new ClassPathContextResource(path, getClassLoader());
	}

 

 

资源路径同Resource转换规则:(选择不同加载策略规则)




从DefaultResourceLoader.getResource(String location)可看出,未指定前缀时,通过getResourceByPath()获得Resource。不同ApplicationContext不同实现。

FileSystemXmlApplicationContext 覆盖getResourceByPath()方法,获得FileSystemResource

 

	/**
	 * Resolve resource paths as file system paths.
	 * <p>Note: Even if a given path starts with a slash, it will get
	 * interpreted as relative to the current VM working directory.
	 * This is consistent with the semantics in a Servlet container.
	 * @param path path to the resource
	 * @return Resource handle
	 * @see org.springframework.web.context.support.XmlWebApplicationContext#getResourceByPath
	 */
	@Override
	protected Resource getResourceByPath(String path) {
		if (path != null && path.startsWith("/")) {
			path = path.substring(1);
		}
		return new FileSystemResource(path);
	}

 

 

 XmlWebApplicationContext:

	/**
	 * This implementation supports file paths beneath the root of the ServletContext.
	 * @see ServletContextResource
	 */
	@Override
	protected Resource getResourceByPath(String path) {
		return new ServletContextResource(this.servletContext, path);
	}

 

ResourceLoader策略模式应用

 

 

 

ResourceLoaderAware接口

 

void setResourceLoader(ResourceLoader resourceLoader);
 实现该接口的类部署到application context中时,context会识别为ResourceLoaderAware,application context 会调用setResourceLoader方法,把自身作为参数传入该方法。(因为ApplicationContext 实现了ResourceLoader接口)

 

自动装配@Autowired  xml:autowire="byType"  代替接口实现

 

ApplicationContext中资源路径通配符

   ant风格路径表达式:

         *   匹配0或者任意数量的字符

         ? 匹配任何单字符

         **  匹配0或者更多的目录

URL路径说明
/app/*.x匹配(Matches)所有在app路径下的.x文件
/app/p?ttern匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern
/**/example匹配(Matches) /app/example, /app/foo/example, 和 /example
/app/**/dir/file.*匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html,/app/foo/bar/dir/file.pdf, 和 /app/dir/file.java
/**/*.jsp匹配(Matches)任何的.jsp 文件

 

属性:
最长匹配原则(has more characters)
说明,URL请求/app/dir/file.jsp,现在存在两个路径匹配模式/**/*.jsp和/app/dir/*.jsp,那么会根据模式/app/dir/*.jsp来匹配

   a) 资源路径前缀classpath: 同 classpath*: 区别

        

        http://blog.csdn.net/zl3450341/article/details/9306983

        1、classpath 只返回第一个匹配Resource,classpath* 返回所有匹配Resource

        2、classpath*:直接跟通配符路径,则无法找到jar中的资源

	public static void main(String[] args) {
		ResourcePatternResolver resolver =  new PathMatchingResourcePatternResolver();
		try {
			/**
			 * 21
URL [file:/E:/xxx/target/classes/META-INF/MANIFEST.MF]
URL [jar:file:/E:/xxx/lib/jboss-jmx.jar!/META-INF/MANIFEST.MF]
URL [jar:file:/E:/xxx/lib/jboss-system.jar!/META-INF/MANIFEST.MF]
			 */
			Resource[] resources = resolver.getResources("classpath*:/META-INF/MANIFEST.MF");
			/*only 
			file [E:\xxxx\target\classes\META-INF\MANIFEST.MF]
			*/
			//Resource[] resources = resolver.getResources("classpath*:/META-INF*/MANIFEST*.MF");
			System.out.println(resources.length);
			for(Resource res:resources){
				System.out.println(res);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

 

   b) 

 

 

 

Spring 资源访问剖析和策略模式应用

深入Spring IOC源码之ResourceLoader

 

 

  • 大小: 37.4 KB
  • 大小: 94.9 KB
  • 大小: 14.7 KB
  • 大小: 28.1 KB
  • 大小: 96.1 KB
分享到:
评论

相关推荐

    org.springframework.core_3.1.1.RELEASE.jar

    `ResourceLoader`则提供了加载资源的通用方法。 4. `org.springframework.core.log`: 提供了日志相关的抽象,如`Log`接口,它是Spring的内部日志抽象,可以适配多种日志实现。 5. `org.springframework.core....

    spring源代码

    //只加载一个绝对匹配Resource,且通过ResourceLoader.getResource进行加载 Resource[] resources = resolver.getResources("classpath:META-INF/INDEX.LIST"); Assert.assertEquals(1, resources.length); //...

    Spring-Reference_zh_CN(Spring中文参考手册)

    4.4. ResourceLoader 4.5. ResourceLoaderAware 接口 4.6. 把Resource作为属性来配置 4.7. Application context 和Resource 路径 4.7.1. 构造application context 4.7.1.1. 创建 ClassPathXmlApplicationContext ...

    Springboot访问Resource下的文件.pdf

    这里,`resourceLoader.getResource("classpath:file.pdf")`会返回一个`Resource`对象,代表了`file.pdf`的URL。然后通过`getInputStream()`方法,我们可以获取到一个输入流,从而可以读取文件内容。 3. **文件...

    spring-framework-reference-4.1.2

    3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................

    Spring实战之ResourceLoader接口资源加载用法示例

    Spring实战之ResourceLoader接口资源加载用法示例 Spring Framework 提供了 ResourceLoader 接口来加载资源,资源可以是文件、URL、classpath 等。ResourceLoader 接口提供了多种资源加载方式,例如从文件系统、...

    spring-framework-reference4.1.4

    3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................

    spring framewok 4参考文档

    ResourceLoader接口负责加载Resource对象,而ResourceLoaderAware接口允许对象得到通知它们是由哪个ResourceLoader加载的。 #### 验证、数据绑定和类型转换 Spring提供了丰富的数据验证功能,可以通过Spring的...

    Spring 2.0 开发参考手册

    4.4. ResourceLoader 4.5. ResourceLoaderAware 接口 4.6. 把Resource作为属性来配置 4.7. Application context 和Resource 路径 4.7.1. 构造application context 4.7.2. Application context构造器中资源路径...

    spring3.x 实战资源教程

    根据给定的文件信息,我们可以提炼出多个与Spring 3.x相关的知识点,下面将逐一进行详细阐述。 ### 1. Spring IoC 容器的基本概念 #### 1.1 IoC容器简介 - **概念**:IoC(Inversion of Control)控制反转,是一种...

    spring源码包.zip

    本篇文章将深入探讨Spring的核心模块,包括`spring-context`、`spring-webmvc`、`spring-web`、`spring-beans`、`spring-core`、`spring-jdbc`、`spring-aop`、`spring-tx`、`spring-jms`以及`spring-expression`,...

    Spring中文帮助文档

    4.4. ResourceLoader接口 4.5. ResourceLoaderAware 接口 4.6. 把Resource作为属性来配置 4.7. Application context 和Resource 路径 4.7.1. 构造application context 4.7.2. Application context构造器中资源...

    spring chm文档

    4.4. ResourceLoader 4.5. ResourceLoaderAware 接口 4.6. 把Resource作为属性来配置 4.7. Application context 和Resource 路径 4.7.1. 构造application context 4.7.2. Application context构造器中资源路径...

    spring-context-3.0.2.release.jar.zip

    3.0.2 RELEASE版本改进了对各种资源的访问,包括文件系统、URL、classpath等,提供了统一的`Resource`接口和`ResourceLoader`,方便开发者读取和操作资源。 最后,国际化支持在Spring-Context 3.0.2 RELEASE中也有...

    Spring API

    4.4. ResourceLoader接口 4.5. ResourceLoaderAware 接口 4.6. 把Resource作为属性来配置 4.7. Application context 和Resource 路径 4.7.1. 构造application context 4.7.2. Application context构造器中资源...

    spring3.x的读书笔记-2

    ResourceLoader接口定义了资源加载的策略,而PathMatchingResourcePatternResolver是其一个实现,用于解析包含通配符的资源路径。 接下来,我们讨论BeanFactory和ApplicationContext。BeanFactory是Spring框架的...

    spring读取jar中的配置文件

    Resource resource = resourceLoader.getResource("classpath:META-INF/config/application.properties"); Properties props = new Properties(); props.load(resource.getInputStream()); // 现在你可以使用...

    SPRING API 2.0.CHM

    ResourceLoader ResourceLoaderAware ResourceMapFactoryBean ResourceOverridingShadowingClassLoader ResourcePatternResolver ResourcePatternUtils ResourceScriptSource ResourceServlet ResourceUtils...

    Spring实战之ResourceLoaderAware加载资源用法示例

    ResourceLoader接口是Spring框架中一个重要的接口,用于提供对资源的加载和访问能力。该接口提供了多种方法,例如getResource(String location)、getClassLoader()等,用于加载和访问不同的资源。 三、使用...

    spring框架的设计理念--copy

    ### Spring框架的设计理念与核心组件解析 #### 一、Spring框架概述 Spring作为一个全面的轻量级企业级应用开发框架,其设计的核心理念是简化Java企业级应用开发过程中的复杂度。Spring通过提供一系列的核心组件和...

Global site tag (gtag.js) - Google Analytics