BeanDefinition的Resource定位——2
1.FileSystemXmlApplicationContext的实现
 public class FileSystemXmlApplicationContext extends AbstractXmlApplicationContext {
     /**
      * Create a new FileSystemXmlApplicationContext for bean-style configuration.
      * @see #setConfigLocation
      * @see #setConfigLocations
      * @see #afterPropertiesSet()
      */
     public FileSystemXmlApplicationContext() {
     }
     /**
      * Create a new FileSystemXmlApplicationContext for bean-style configuration.
      * @param parent the parent context
      * @see #setConfigLocation
      * @see #setConfigLocations
      * @see #afterPropertiesSet()
      */
     public FileSystemXmlApplicationContext(ApplicationContext parent) {
         super(parent);
     }
     /**
      * 这个构造函数的configLocation包含的是BeanDefinition所在的文件路径
      * Create a new FileSystemXmlApplicationContext, loading the definitions
      * from the given XML file and automatically refreshing the context.
      * @param configLocation file path
      * @throws BeansException if context creation failed
      */
     public FileSystemXmlApplicationContext(String configLocation) throws BeansException {
         this(new String[] {configLocation}, true, null);
     }
     /**
      * 这个构造函数允许configLocation包含多个BeanDefinition的文件路径
      * Create a new FileSystemXmlApplicationContext, loading the definitions
      * from the given XML files and automatically refreshing the context.
      * @param configLocations array of file paths
      * @throws BeansException if context creation failed
      */
     public FileSystemXmlApplicationContext(String... configLocations) throws BeansException {
         this(configLocations, true, null);
     }
     /**
      * 这个构造函数在允许configLocation包含多个BeanDefinition的文件路径的同时,还允许指定
      * 自己的双亲IoC容器
      * Create a new FileSystemXmlApplicationContext with the given parent,
      * loading the definitions from the given XML files and automatically
      * refreshing the context.
      * @param configLocations array of file paths
      * @param parent the parent context
      * @throws BeansException if context creation failed
      */
     public FileSystemXmlApplicationContext(String[] configLocations, ApplicationContext parent) throws BeansException {
         this(configLocations, true, parent);
     }
     /**
      * Create a new FileSystemXmlApplicationContext, loading the definitions
      * from the given XML files.
      * @param configLocations array of file paths
      * @param refresh whether to automatically refresh the context,
      * loading all bean definitions and creating all singletons.
      * Alternatively, call refresh manually after further configuring the context.
      * @throws BeansException if context creation failed
      * @see #refresh()
      */
     public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh) throws BeansException {
         this(configLocations, refresh, null);
     }
     /**
      * 在对象的初始化过程中,调用refresh函数载入BeanDefinition,这个refresh启动了
      * BeanDefinition的载入过程,我们会在下面进行详细分析
      * Create a new FileSystemXmlApplicationContext with the given parent,
      * loading the definitions from the given XML files.
      * @param configLocations array of file paths
      * @param refresh whether to automatically refresh the context,
      * loading all bean definitions and creating all singletons.
      * Alternatively, call refresh manually after further configuring the context.
      * @param parent the parent context
      * @throws BeansException if context creation failed
      * @see #refresh()
      */
     public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
             throws BeansException {
         super(parent);
         setConfigLocations(configLocations);
         if (refresh) {
             refresh();
         }
     }
     /**
      * 这是应用于文件系统中Resource的实现,通过构造一个FileSystemResource来得到一个在文件
      * 系统中定位的BeanDefinition
      * 这个getResourceByPath是在BeanDefinitionReader的loadBeanDefinition中被调用的
      * loadBeanDfinition采用了模板模式,具体的定位实现实际上是由各个子类来完成的
      *
      *
      * Resolve resource paths as file system paths.
      * <p>Note: Even if a given path starts with a slash, it will get
      * interpreted as relative to the current VM working directory.
      * This is consistent with the semantics in a Servlet container.
      * @param path path to the resource
      * @return Resource handle
      * @see org.springframework.web.context.support.XmlWebApplicationContext#getResourceByPath
      */
     @Override
     protected Resource getResourceByPath(String path) {
         if (path != null && path.startsWith("/")) {
             path = path.substring(1);
         }
         return new FileSystemResource(path);
     }
 }
FileSystemXmlApplicationContext的实现
2.在FileSystemXmlApplicationContext中,我们可以看到在构造函数中,实现了对configuration进行处理的功能,让所有配置在文件系统中的,以XML文件方式存在的BeanDefinition都能够得到有效的处理,比如,实现了getResourceByPath方法,这个方法是一个模板方法,是为读取Resource服务的。
3.对于IoC容器功能的实现,这里没有涉及,因为它继承了AbstractXmlApplicationContext,关于IoC容器功能相关的实现,都是在FileSystemXmlApplicationContext中完成的,但是在构造函数中通过refresh来启动IoC容器的初始化,这个refresh方法非常重要,也是我们以后分析容器初始化过程实现的一个重要入口。
4.注意:FileSystemXmlApplicationContext是一个支持XML定义BeanDefinition的ApplicationContext,并且可以指定以文件形式的BeanDefinition的读入,这些文件可以使用文件路径和URL定义来表示。在测试环境和独立应用环境中,这个ApplicationContext是非常有用的。
5.根据图1的调用关系分析,我们可以清楚地看到整个BeanDefinition资源定位的过程。这个对BeanDefinition资源定位的过程,最初是由refresh来触发的,这个refresh的调用是在FileSystemXmlBeanFactory的构造函数中启动的,大致的调用过程如图2所示。

图1 getResourceByPath的调用关系

图2 getResourceByPath的调用过程
BeanDefinition的Resource定位——2的更多相关文章
- Spring源码解析(二)BeanDefinition的Resource定位
		IOC容器的初始化过程主要包括BeanDefinition的Resource定位.载入和注册.在实际项目中我们基本上操作的都是ApplicationContex的实现,我们比较熟悉的ClassPath ... 
- BeanDefinition的Resource定位
		1.以编程的方式使用DefaultListableBeanFactory时,首先定义一个Resource来定位容器使用的BeanDefiniton.这时使用的是ClassPathResource,这意 ... 
- IOC容器初始化——BeanDefinition的Resource定位
		以编程的方式使用DefaultListableBeanFactory时,首先定义一个Resource来定位容器使用的BeanDefinition.这是使用的是ClassPathResource,意味着 ... 
- BeanDefinition的Resource定位——3
		1.我们重点看看AbstractRefreshableApplicationContext的refreshBeanFactory方法的实现,这个refreshBeanFactory被FileSyste ... 
- Resource 定位、BeanDefinition 的载入和解析,BeanDefinition 注册。
		在前文提过,IOC 容器的初始化过程分为三步骤:Resource 定位.BeanDefinition 的载入和解析,BeanDefinition 注册. Resource 定位.我们一般用外部资源来描 ... 
- 【初探Spring】------Spring IOC(三):初始化过程---Resource定位
		我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ... 
- Spring IOC容器的初始化—(一)Resource定位
		前言 上一篇博文“ Spring IOC是怎样启动的 ”中提到了refresh()方法,这个就是容器初始化的入口.容器初始化共有三个阶段: 第一阶段:Resource定位 第二阶段:BeanDefin ... 
- Spring-IOC源码解读2.1-BeanDefinition的Resource定位
		Spring通过ResourceLoader来处理得到的Resource.在前面我们知道容器初始化是以refresh()方法为入口的,内部的实现首先准备上下文,然后通过obtainFreshBeanF ... 
- BeanDefinition的载入和解析
		1.在完成对代表BeanDefinition的Resource定位的分析后,下面来了解整个BeanDefinition信息的载入过程. 2.对IoC容器来说,这个载入过程,相当于把定义的BeanDef ... 
随机推荐
- Android输入输出机制之来龙去脉
			openInputChannelPair( 阅读本文的前提条件是知道匿名管道和匿名共享内存是怎么一回事,否则阅读相应的文章. Anonymous pipes 和Anonymous Shared Mem ... 
- 【JavaScript】关于delete
			delete 只能删除属性,不能删除变量 比如 var m = "haha"; delete m; //false m = "haha";----->wi ... 
- iOS开发——实用技术OC篇&简单抽屉效果的实现
			简单抽屉效果的实现 就目前大部分App来说基本上都有关于抽屉效果的实现,比如QQ/微信等.所以,今天我们就来简单的实现一下.当然如果你想你的效果更好或者是封装成一个到哪里都能用的工具类,那就还需要下一 ... 
- WebService究竟是什么?
			一.序言 大家或多或少都听过WebService(Web服务),有一段时间非常多计算机期刊.书籍和站点都大肆的提及和宣传WebService技术,当中不乏非常多吹嘘和做广告的成分.可是不得不承认的是W ... 
- POJ  3126 Prime Path  (BFS)
			[题目链接]click here~~ [题目大意]给你n,m各自是素数,求由n到m变化的步骤数,规定每一步仅仅能改变个十百千一位的数,且变化得到的每个数也为素数 [解题思路]和poj 3278类似.b ... 
- IOS试题收集1
			IOS试题收集1 1.Objective C中有多继承吗?没有的话用什么代替? Protocol 2.Objective C中有私有方法吗?私有变量呢? OC类里面只有静态方法和实例方法这两种,@pr ... 
- AndroidManifest.xml 详解 (四) 之uses-permission
			The <uses-permission> Element 我们现在告别<application>元素,回到<manifest>中定义的子元素,<uses-p ... 
- open和fopen的区别
			open和fopen的区别: 1.缓冲文件系统缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓 ... 
- Android精品课程—PullToRefresh 下拉刷新
			http://edu.csdn.net/course/detail/1716 TableLayout http://edu.csdn.net/course/detail/2262 Android开发之 ... 
- 除去字符串中不相临的重复的字符 aabcad 得 aabcd
			假设有一个字符串aabcad,请编写一段程序,去掉字符串中不相邻的重复字符.即上述字串处理之后结果是为:aabcd; 分析,重点考查 char 与int 的隐式转换.程序如下: static void ... 
