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
Spring Resource
接口类结构图为了更好地理解,在这里我先放一张策略模式
的UML图,它的具体内容本文不讲。cdn
好了!图片放上去了,那么策略模式
在Resource
体系上如何体现出来呢?xml
Resource
接口至关于咱们的策略
AbstractResource
在内都属于咱们的具体策略实现
context
角色到哪里去了呢?哈哈,作生意不能忘了咱们的老本啊!它就是咱们的IOC容器ApplicationContext
,它是咱们策略模式中最最最具备决策能力的老大了至于为何容器就能够处理咱们的Resource
,我接下去会说到!blog
很明显,Resource
是资源的最高抽象,一般咱们的应用程序不是都从classpath
下去加载咱们的xml文件,咱们也能够经过一个URL
,URI
,InputStream
等方式获取一个资源,这就是Spring把资源的获取方式和资源的定义之间解耦了!接口
ResourceLoader
接口ResourceLoader
:该接口实现类的实例能够得到一个 Resource 实例。。在 ResourceLoader
接口里有以下方法:
Resource getResource(String location)
:该接口仅包含这个方法,该方法用于返回一个 Resource
实例。ApplicationContext
的实现类都实现 ResourceLoader
接口,而该接口又返回一个Resource
实例,所以 ApplicationContext
可用于直接获取 Resource
实例,这也是为何容器就能够处理Resource
的缘由!
策略模式
在Spring中使用有什么优点当 Spring
应用须要进行资源访问时,实际上并不须要直接使用 Resource
实现类,而是调用 ApplicationContext
实例的 getResource()
方法来得到资源,ApplicationContext
将会负责选择 Resource
的实现类,也就是肯定具体的资源访问策略,从而将应用程序和具体的资源访问策略分离开来。
既然有那么多的优点,下面就在来解释咱们上面的第一段代码,为何要使用ClassPathXmlApplicationContext
这个类来对资源进行加载?
咱们都知道,在容器ApplicationContext
下有不少的实现,好比FileSystemXmlApplicationContext
,ClassPathXmlApplicationContext
,XmlWebApplicationContext
,并且咱们加载配置文件的方式一般也是使用它们来进行加载,在Spring中,ApplicationContext
的实现类顾名思义也是对应了咱们Resource
接口的一些实现策略,好比ClassPathResource
,FileSystemResource
等。