谈一谈我对Spring Resource的理解

1、什么是Resource

当咱们学习Spring时,咱们总会在xml中对bean进行声明,而后再经过下面的代码片断来获取bean。代码以下:spring

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Context {

  public static void main(String[] args) {
    
    ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring.xml");//一、加载配置文件
    System.err.println(ctx.getBean("stu").toString());//二、经过配置文件获取一个bean并打印

   }
}
复制代码

上面第一行代码加载了一个资源文件Spring.xml,这个资源文件在Spring中属于Resource的一种。这样讲,Spring把各类类型的文件,二进制流都称之为Resource,只不过对于Spring开发者来讲,Resource大多都是xml文件。bash

Resource是一个接口,接口里边定义了很是多关于文件的操做策略,好比学习

  • exists():判断资源是否存在
  • getURL():获取资源的URL
  • getFilename():获取资源的名称
  • ......(方法很是多,我就不一一列举了)

Resource 接口是具体资源访问策略的抽象,也是全部资源访问类所实现的接口。Resource 接口自己没有提供访问任何底层资源的实现逻辑,针对不一样的底层资源,Spring 将会提供不一样的 Resource 实现类,不一样的实现类负责不一样的资源访问逻辑。spa

很是重要的一点,这也是Spring Resource设计最美妙的地方,那就是Spring 在Resource资源处理上采用啦策略模式,这也是我为何上面把Resource接口中的方法称之为策略的缘由了!设计

若是还不了解Java 策略模式的朋友请先自行学习!code

2、Spring Resource接口类结构图

为了更好地理解,在这里我先放一张策略模式的UML图,它的具体内容本文不讲。cdn

好了!图片放上去了,那么策略模式Resource体系上如何体现出来呢?xml

  • 一、Resource接口至关于咱们的策略
  • 二、下面全部的实现类,包括AbstractResource在内都属于咱们的具体策略实现
  • 三、你可能要问,那么咱们的context角色到哪里去了呢?哈哈,作生意不能忘了咱们的老本啊!它就是咱们的IOC容器ApplicationContext,它是咱们策略模式中最最最具备决策能力的老大了

至于为何容器就能够处理咱们的Resource,我接下去会说到!blog

很明显,Resource是资源的最高抽象,一般咱们的应用程序不是都从classpath下去加载咱们的xml文件,咱们也能够经过一个URL,URI,InputStream等方式获取一个资源,这就是Spring把资源的获取方式和资源的定义之间解耦了!接口

3、ResourceLoader接口

  • ResourceLoader:该接口实现类的实例能够得到一个 Resource 实例。。

ResourceLoader 接口里有以下方法:

  • Resource getResource(String location):该接口仅包含这个方法,该方法用于返回一个 Resource 实例。

ApplicationContext 的实现类都实现 ResourceLoader 接口,而该接口又返回一个Resource实例,所以 ApplicationContext 可用于直接获取 Resource 实例,这也是为何容器就能够处理Resource的缘由!

4、策略模式在Spring中使用有什么优点

Spring 应用须要进行资源访问时,实际上并不须要直接使用 Resource 实现类,而是调用 ApplicationContext 实例的 getResource() 方法来得到资源,ApplicationContext 将会负责选择 Resource 的实现类,也就是肯定具体的资源访问策略,从而将应用程序和具体的资源访问策略分离开来。

既然有那么多的优点,下面就在来解释咱们上面的第一段代码,为何要使用ClassPathXmlApplicationContext这个类来对资源进行加载?

咱们都知道,在容器ApplicationContext下有不少的实现,好比FileSystemXmlApplicationContext,ClassPathXmlApplicationContext,XmlWebApplicationContext,并且咱们加载配置文件的方式一般也是使用它们来进行加载,在Spring中,ApplicationContext的实现类顾名思义也是对应了咱们Resource接口的一些实现策略,好比ClassPathResource,FileSystemResource等。

相关文章
相关标签/搜索