不管是资源(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架构与设计原理(第2版)》这本书主要聚焦于Spring框架的核心架构和技术细节,帮助读者全面理解Spring的工作机制、设计理念以及实现方式。下面将根据书名及其描述来展开相关知识点。 ...
在Spring框架中,策略模式是一种常见的设计模式,它允许我们定义一组可互换的策略,这些策略可以在运行时根据需求动态选择。这篇文章将深入探讨如何在Spring中运用策略模式,并结合源码分析其工作原理。 策略模式的...
根据提供的文件标题“Spring技术内幕:深入解析Spring架构与设计原理(第2版)”和描述,我们可以了解到这是一本深入探讨Spring框架内部架构和技术细节的专业书籍。虽然标签中出现了“oracle”,但从标题和描述来看,...
SPRING技术内幕:深入解析SPRING架构与设计原理.pdf(带书签)
8. **策略模式**:Spring MVC的拦截器和Spring Data的多数据源访问策略是策略模式的例子,可以根据策略选择不同的执行路径。 9. **模板方法模式**:Spring的JdbcTemplate和RestTemplate等提供了模板方法,定义了...
【Spring AOP设计模式】是Spring框架中面向切面编程的重要组成部分,它允许开发者通过分离关注点来解耦代码,实现灵活的模块化设计。在本章中,我们将探讨17种设计模式在Spring AOP中的应用和实现,以及它们如何帮助...
Spring技术内幕:深入解析Spring架构与设计原理(第2部分) 《Spring技术内幕:深入解析Spring架构与设计原理》是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自执笔!Java开发者社区和Spring...
### Spring框架的设计理念与设计模式分析 #### 一、Spring框架概述 Spring作为一个现代软件开发领域内备受推崇的框架,其设计理念与设计模式一直是开发者关注的焦点。Spring框架以其轻量级、模块化和可扩展性著称...
策略模式是一种行为设计模式,它允许开发者定义一些策略族,分别封装起来,每一个策略中的算法具有一定的独立性,分别在不同的上下文中完成不同的任务。策略模式通常由三个部分组成:策略接口、策略实现类、环境上...
### Spring技术内幕:深入解析Spring架构与设计原理(第2版) #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,它最初是为了简化企业级Java应用程序的开发而设计的。随着版本的不断迭代,...
### Spring技术内幕:深入解析Spring架构与设计原理 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源框架,最初是为了解决企业级应用开发中的复杂性而诞生的。Spring框架的核心特性可以被方便地...
### Spring框架的设计理念与设计模式分析 #### 一、Spring框架概述 Spring作为一个现代软件开发领域内备受推崇的框架,其强大的功能与灵活性使得它在众多框架中脱颖而出。本文旨在深入探讨Spring框架的设计理念...
Spring设计模式简介:主要是讲述Spring源码中运用到的一些设计模式 Ibatis设计模式简介:主要是讲述Ibatis源码中运用到的一些设计模式 设计模式简介 1 单例模式 2 责任链模式 3 策略模式 4 模板方法模式 5 工厂方法...
《Spring技术内幕:深入解析Spring架构与设计原理》是一本深度剖析Spring框架核心机制的专著,旨在帮助读者深入理解Spring的内部运作机制及其设计理念。本书涵盖了Spring的两大核心技术——控制反转(IoC)和面向切...
### Spring框架的设计理念与设计模式分析 #### 一、Spring框架概述 Spring作为一个现代软件开发领域内备受推崇的框架,其设计理念与设计模式一直是开发者关注的焦点。Spring框架以其轻量级、模块化和可扩展性著称...
技术: 1. spring事件驱动(ApplicationEventPublisher) 2. 策略模式处理事件 目的: 1. 通过event,代码逻辑异步处理 2. 通过策略模式,构建具体监听实现 3. 解耦 4. 容错(降低代码块错误风险)