`
rongxh2010
  • 浏览: 48945 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring完美设计:Resource接口与策略模式

阅读更多

不管是资源(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版) .pdf

    《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》这本书主要聚焦于Spring框架的核心架构和技术细节,帮助读者全面理解Spring的工作机制、设计理念以及实现方式。下面将根据书名及其描述来展开相关知识点。 ...

    Spring下使用策略模式

    在Spring框架中,策略模式是一种常见的设计模式,它允许我们定义一组可互换的策略,这些策略可以在运行时根据需求动态选择。这篇文章将深入探讨如何在Spring中运用策略模式,并结合源码分析其工作原理。 策略模式的...

    SPRING技术内幕:深入解析SPRING架构与设计原理.pdf(带书签)

    SPRING技术内幕:深入解析SPRING架构与设计原理.pdf(带书签)

    掌握Spring设计模式:Java工程师必备指南

    8. **策略模式**:Spring MVC的拦截器和Spring Data的多数据源访问策略是策略模式的例子,可以根据策略选择不同的执行路径。 9. **模板方法模式**:Spring的JdbcTemplate和RestTemplate等提供了模板方法,定义了...

    第四章:Spring AOP API 设计模式1

    【Spring AOP设计模式】是Spring框架中面向切面编程的重要组成部分,它允许开发者通过分离关注点来解耦代码,实现灵活的模块化设计。在本章中,我们将探讨17种设计模式在Spring AOP中的应用和实现,以及它们如何帮助...

    Spring技术内幕:深入解析Spring架构与设计原理(第2部分)

    Spring技术内幕:深入解析Spring架构与设计原理(第2部分) 《Spring技术内幕:深入解析Spring架构与设计原理》是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自执笔!Java开发者社区和Spring...

    Spring框架的设计理念与设计模式分析

    ### Spring框架的设计理念与设计模式分析 #### 一、Spring框架概述 Spring作为一个现代软件开发领域内备受推崇的框架,其设计理念与设计模式一直是开发者关注的焦点。Spring框架以其轻量级、模块化和可扩展性著称...

    详解SpringBoot结合策略模式实战套路

    策略模式是一种行为设计模式,它允许开发者定义一些策略族,分别封装起来,每一个策略中的算法具有一定的独立性,分别在不同的上下文中完成不同的任务。策略模式通常由三个部分组成:策略接口、策略实现类、环境上...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)

    ### Spring技术内幕:深入解析Spring架构与设计原理(第2版) #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,它最初是为了简化企业级Java应用程序的开发而设计的。随着版本的不断迭代,...

    多图详解Spring框架的设计理念与设计模式

    ### Spring框架的设计理念与设计模式解析 #### 一、Spring框架的发展历程与背景 Spring框架是由Rod Johnson在2002年开始开发的,最初源于他对Java EE标准框架中存在问题的深刻反思。Rod Johnson在其著作《Expert ...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版).pdf

    ### Spring技术内幕:深入解析Spring架构与设计原理 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源框架,最初是为了解决企业级应用开发中的复杂性而诞生的。Spring框架的核心特性可以被方便地...

    Spring框架的设计理念与设计模式分析之一

    ### Spring框架的设计理念与设计模式分析 #### 一、Spring框架概述 Spring作为一个现代软件开发领域内备受推崇的框架,其强大的功能与灵活性使得它在众多框架中脱颖而出。本文旨在深入探讨Spring框架的设计理念...

    Java 经典设计模式讲解以及项目实战

    Spring设计模式简介:主要是讲述Spring源码中运用到的一些设计模式 Ibatis设计模式简介:主要是讲述Ibatis源码中运用到的一些设计模式 设计模式简介 1 单例模式 2 责任链模式 3 策略模式 4 模板方法模式 5 工厂方法...

    Spring技术内幕:深入解析Spring架构与设计原理

    《Spring技术内幕:深入解析Spring架构与设计原理》是一本深度剖析Spring框架核心机制的专著,旨在帮助读者深入理解Spring的内部运作机制及其设计理念。本书涵盖了Spring的两大核心技术——控制反转(IoC)和面向切...

    Spring 框架的设计理念与设计模式分析

    ### Spring框架的设计理念与设计模式分析 #### 一、Spring框架概述 Spring作为一个现代软件开发领域内备受推崇的框架,其设计理念与设计模式一直是开发者关注的焦点。Spring框架以其轻量级、模块化和可扩展性著称...

    spring事件驱动 + 策略模式应用

    技术: 1. spring事件驱动(ApplicationEventPublisher) 2. 策略模式处理事件 目的: 1. 通过event,代码逻辑异步处理 2. 通过策略模式,构建具体监听实现 3. 解耦 4. 容错(降低代码块错误风险)

    54-Spring设计模式之装饰器模式1

    在 Spring 设计模式中,装饰器模式经常与其他设计模式比较。例如,代理模式、适配器模式和模板方法模式。 * 代理模式:代理模式和装饰器模式类似,但是代理模式更关心的是控制原有对象的访问,而不是添加新的行为或...

Global site tag (gtag.js) - Google Analytics