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或者更多的目录
属性:
最长匹配原则(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 资源访问剖析和策略模式应用
相关推荐
`ResourceLoader`则提供了加载资源的通用方法。 4. `org.springframework.core.log`: 提供了日志相关的抽象,如`Log`接口,它是Spring的内部日志抽象,可以适配多种日志实现。 5. `org.springframework.core....
//只加载一个绝对匹配Resource,且通过ResourceLoader.getResource进行加载 Resource[] resources = resolver.getResources("classpath:META-INF/INDEX.LIST"); Assert.assertEquals(1, resources.length); //...
4.4. ResourceLoader 4.5. ResourceLoaderAware 接口 4.6. 把Resource作为属性来配置 4.7. Application context 和Resource 路径 4.7.1. 构造application context 4.7.1.1. 创建 ClassPathXmlApplicationContext ...
这里,`resourceLoader.getResource("classpath:file.pdf")`会返回一个`Resource`对象,代表了`file.pdf`的URL。然后通过`getInputStream()`方法,我们可以获取到一个输入流,从而可以读取文件内容。 3. **文件...
3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................
Spring实战之ResourceLoader接口资源加载用法示例 Spring Framework 提供了 ResourceLoader 接口来加载资源,资源可以是文件、URL、classpath 等。ResourceLoader 接口提供了多种资源加载方式,例如从文件系统、...
3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................
ResourceLoader接口负责加载Resource对象,而ResourceLoaderAware接口允许对象得到通知它们是由哪个ResourceLoader加载的。 #### 验证、数据绑定和类型转换 Spring提供了丰富的数据验证功能,可以通过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 3.x相关的知识点,下面将逐一进行详细阐述。 ### 1. Spring IoC 容器的基本概念 #### 1.1 IoC容器简介 - **概念**:IoC(Inversion of Control)控制反转,是一种...
本篇文章将深入探讨Spring的核心模块,包括`spring-context`、`spring-webmvc`、`spring-web`、`spring-beans`、`spring-core`、`spring-jdbc`、`spring-aop`、`spring-tx`、`spring-jms`以及`spring-expression`,...
4.4. ResourceLoader接口 4.5. ResourceLoaderAware 接口 4.6. 把Resource作为属性来配置 4.7. Application context 和Resource 路径 4.7.1. 构造application context 4.7.2. Application context构造器中资源...
4.4. ResourceLoader 4.5. ResourceLoaderAware 接口 4.6. 把Resource作为属性来配置 4.7. Application context 和Resource 路径 4.7.1. 构造application context 4.7.2. Application context构造器中资源路径...
3.0.2 RELEASE版本改进了对各种资源的访问,包括文件系统、URL、classpath等,提供了统一的`Resource`接口和`ResourceLoader`,方便开发者读取和操作资源。 最后,国际化支持在Spring-Context 3.0.2 RELEASE中也有...
4.4. ResourceLoader接口 4.5. ResourceLoaderAware 接口 4.6. 把Resource作为属性来配置 4.7. Application context 和Resource 路径 4.7.1. 构造application context 4.7.2. Application context构造器中资源...
ResourceLoader接口定义了资源加载的策略,而PathMatchingResourcePatternResolver是其一个实现,用于解析包含通配符的资源路径。 接下来,我们讨论BeanFactory和ApplicationContext。BeanFactory是Spring框架的...
Resource resource = resourceLoader.getResource("classpath:META-INF/config/application.properties"); Properties props = new Properties(); props.load(resource.getInputStream()); // 现在你可以使用...
ResourceLoader ResourceLoaderAware ResourceMapFactoryBean ResourceOverridingShadowingClassLoader ResourcePatternResolver ResourcePatternUtils ResourceScriptSource ResourceServlet ResourceUtils...
ResourceLoader接口是Spring框架中一个重要的接口,用于提供对资源的加载和访问能力。该接口提供了多种方法,例如getResource(String location)、getClassLoader()等,用于加载和访问不同的资源。 三、使用...
### Spring框架的设计理念与核心组件解析 #### 一、Spring框架概述 Spring作为一个全面的轻量级企业级应用开发框架,其设计的核心理念是简化Java企业级应用开发过程中的复杂度。Spring通过提供一系列的核心组件和...