不管是资源(Resource),还是资源加载器(ResourceLoader),Spring都把它定义成了接口的形式,而不是类的形式。这样降低了与具体的实现类之间的耦合,更具灵活性与易扩展性。它们的关系图如下:
且看ResourceLoader的getResource(String location)方法的声明:
/**
* Return a Resource handle for the specified resource.
* The handle should always be a reusable resource descriptor,
* allowing for multiple {@link Resource#getInputStream()} calls.
* <p><ul>
* <li>Must support fully qualified URLs, e.g. "file:C:/test.dat".
* <li>Must support classpath pseudo-URLs, e.g. "classpath:test.dat".
* <li>Should support relative file paths, e.g. "WEB-INF/test.dat".
* (This will be implementation-specific, typically provided by an
* ApplicationContext implementation.)
* </ul>
* <p>Note that a Resource handle does not imply an existing resource;
* you need to invoke {@link Resource#exists} to check for existence.
* @param location the resource location
* @return a corresponding Resource handle
* @see #CLASSPATH_URL_PREFIX
* @see org.springframework.core.io.Resource#exists
* @see org.springframework.core.io.Resource#getInputStream
*/
Resource getResource(String location);
接口的声明,要求location的格式能满足多形式,也就是要支持多种类型的Resource。上面的类关系图中,我们就可看出有两种Resource,分别是UrlResource和ClasspathResource,前者是加载URL指定的资源,后者是加载类路径中的资源。
我们来看看Spring实现类DefaultResourceLoader中是如何用一个接口方法加载两种资源的:
public Resource getResource(String location) {
Assert.notNull(location, "Location must not be null");
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);
}
}
}
getResource()方法的传入参数,就作为一种策略,要求实现类去判断这种策略的类型,并返回相应的Resource。在这里,Spring是通过try-catch的形式,先判断是否是UrlResource,若不是,则把它当作是ClassPathContextResource来处理。在策略的种类多时,使用if-else判断或switch判断可能更好一点。
此外,我们使用策略模式,常常会定义一个策略接口,策略接口有不同的实现类,分别代表不同的策略。如下图:
在使用策略的时候,将策略接口作为形参,而可传进各种具体的策略实现类对象作为实参,在doSomething()方法中,根据策略的类型,来决定要作出什么样的处理。
- 大小: 43.3 KB
- 大小: 21.9 KB
分享到:
相关推荐
Spring技术内幕:深入解析Spring架构与设计原理.pdf
《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从本书中参透Spring框架的出色架构和设计思想,还能从...
Spring技术内幕:深入解析Spring架构与设计原理(第2部分) 《Spring技术内幕:深入解析Spring架构与设计原理》是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自执笔!Java开发者社区和Spring...
Spring技术内幕:深入解析Spring架构与设计原理(第2版) .pdf
第三部分讲述了ACEGI安全框架、DM模块以及Flex模块等基于Spring的典型应用的设计与实现。 无论你是Java程序员、Spring开发者,还是平台开发人员、系统架构师,抑或是对开源软件源代码着迷的代码狂人,都能从本书中...
SPRING技术内幕:深入解析SPRING架构与设计原理SPRING技术内幕:深入解析SPRING架构与设计原理SPRING技术内幕:深入解析SPRING架构与设计原理SPRING技术内幕:深入解析SPRING架构与设计原理SPRING技术内幕:深入解析...
Spring技术内幕:深入解析Spring架构与设计原理[汇编].pdf
Spring技术内幕:深入解析+Spring架构与设计原理 第二版
更为重要的是,结合Spring的最新版本对过时的内容进行了更新,并增加了大量新内容,使《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》更趋近于完美。《Spring技术内幕:深入解析Spring架构与设计原理...
Spring技术内幕:深入解析Spring架构与设计原理(第2版)+.pdf
《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》是国内一本系统分析Spring源代码的著作,也是Spring领域的问鼎之作,由业界拥有10余年开发经验的专业Java专家亲自执笔,Java开发者社区和Spring开发者...
SPRING技术内幕:深入解析SPRING架构与设计原理.pdf 完整版高清。
作为一个资深Java工程师,我发现《Spring 设计模式总结》PDF非常精彩,它深入剖析了Spring框架中的关键设计模式。例如,简单工厂模式通过BeanFactory展现,实现了松耦合和动态对象创建。工厂方法模式则通过...
国内第一本基于Spring3.0的著作,从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码...
更为重要的是,结合Spring的最新版本对过时的内容进行了更新,并增加了大量新内容,使《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》更趋近于完美。 《Spring技术内幕:深入解析Spring架构与设计原理...
第四章:Spring AOP 设计模式小马哥(mercyblitz)Spring AOP 设计模式抽象工厂模式(Abstract factory)实现构建器模式