



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2.2.2 IoC容器XmlBeanFactory的工作原理这个BeanFactory接口提供了使用IoC容器的规范。在这个基础上,Spring还提供了符合这个IoC容器接口的一系列容器的实现供开发人员使用。例如,在图2-2中,我们可以看到BeanFactory的相关部分的实现。为简单起见,我们浏览一下图2-2的BeanFactory的继承体系,注意AutowireCapableBeanFactoryAbstractAutowireCapableBeanFactoryDefaultListableBeanFactoryXmlBeanFactory IoC容器的实现系列。我们从这个容器系列的最底层实现XmlBeanFactory开始,这个容器的实现与我们在Spring应用中用到的那些上下文相比,有一个非常明显的特点,它只提供了最基本的IoC容器的功能。从它的名字中可以看出,这个IoC容器可以读取以XML形式定义的BeanDefinition。理解这一点有助于理解ApplicationContext与基本的BeanFactory之间的区别和联系。我们可以认为直接的BeanFactory实现是IoC容器的基本形式,而各种ApplicationContext的实现是IoC容器的高级表现形式。关于ApplicationContext的分析,以及它与BeanFactory相比的增强特性都会在下面进行详细的分析。让我们回顾一下这个继承体系,从中可以清楚地看到它们之间的联系,它们都是IoC容器系列的组成部分。在设计这个容器系列时,我们可以从继承体系的发展上看到IoC容器各项功能的实现过程。如果要扩展自己的容器产品,建议读者最好在这个继承体系中检验一下,看看Spring是不是已经提供了现成的或相近的容器实现供我们参考。下面就从我们比较熟悉的XmlBeanFactory的实现入手进行分析,来看看一个基本的IoC容器是怎样实现的。如果仔细阅读XmlBeanFactory的源码,在一开始的注释里面已经对 XmlBeanFactory的功能做了简要的说明,从代码的注释还可以看到,这是Rod Johnson在2001年就写下的代码,可见这个类应该是Spring的元老类了。它是继承DefaultListableBeanFactory这个类的,而且它非常重要,在以后的分析中这个类会经常用到。我们会看到这个DefaultListableBeanFactory实际上包含了IoC容器的重要功能,也是在很多地方都会用到的容器系列中的一个基本产品。从名字上就可以看出来,在Spring中,实际上是把它作为一个默认的完整功能的IoC容器来使用的。XmlBeanFactory在继承了DefaultListableBeanFactory容器的功能的同时,给DefaultListableBeanFactory增加的功能很容易从XmlBeanFactory的名字上猜到。它是一个与XML相关的BeanFactory,也就是说它可以读取以XML文件方式定义的BeanDefinition的一个IoC容器。如果说XmlBeanFactory是一个可以读取XML文件方式定义的BeanDefinition的IoC容器,那么这些实现XML读取的功能是怎样实现的呢?对这些XML文件定义信息的处理并不是由XmlBeanFactory来直接处理的。在XmlBeanFactory中,初始化了一个XmlBeanDefini-tionReader对象,有了这个Reader对象,那些以XML的方式定义的BeanDefinition就有了处理的地方。我们可以看到,对这些XML形式的信息的处理实际上是由这个XmlBeanDefini-tionReader来完成的。构造XmlBeanFactory这个IoC容器时,需要指定BeanDefinition的信息来源,而这个信息来源需要封装成Spring中的Resource类来给出。Resource是Spring用来封装IO操作的类。比如,我们的BeanDefinition信息是以xml文件形式存在的,那么可以使用像ClassPathResource res = new ClassPathResource(beans.xml);这样具体的ClassPathResource来构造需要的Resource,然后作为构造参数传递给XmlBeanFactory构造函数。这样,IoC容器就可以方便地定位到需要的BeanDefinition信息来对Bean完成容器的初始化和依赖注入过程。XmlBeanFactory的功能是建立在DefaultListableBeanFactory这个基本容器的基础上的,在这个基本容器的基础上实现了其他诸如XML读取的附加功能。对于这些功能的实现原理,看一看XmlBeanFactory的代码实现就能很容易地理解。如代码清单2-2所示,在XmlBeanFactory构造方法中需要得到Resource对象。对XmlBeanDefinitionReader对象的初始化,以及使用这个对象来完成loadBeanDefinitions的调用,就是这个调用启动了从Resource中载入BeanDefinitions的过程,loadBeanDefinitions同时也是IoC容器初始化的重要组成部分。代码清单2-2 XmlBeanFactory的实现1. publicclassXmlBeanFactoryextends 2. DefaultListableBeanFactory 3. privatefinalXmlBeanDefinitionReaderreader=new 4. XmlBeanDefinitionReader(this); 5. publicXmlBeanFactory(Resourceresource)throws 6. BeansException 7. this(resource,null); 8. 9. publicXmlBeanFactory(Resourceresource,BeanFactory 10. parentBeanFactory)throws 11. BeansException 12. super(parentBeanFactory); 13. this.reader.loadBeanDefinitions(resource); 14. 15. 我们看到XmlBeanFactory使用了DefaultListableBeanFactory作为基类,DefaultListableBeanFactory是很重要的一个IoC实现,在其他IoC容器中,比如ApplicationContext,其实现的基本原理和XmlBeanFactory一样,也是通过持有或者扩展DefaultListableBeanFactory来获得基本的IoC容器的功能的。参考XmlBeanFactory的实现,我们以编程的方式使用DefaultListableBeanFactory,从中我们可以看到IoC容器使用的一些基本过程。尽管我们在应用中使用IoC容器时很少会使用这样原始的方式,但是了解一下这个基本的过程,对我们了解IoC容器的工作原理却是非常有帮助的。因为这个编程式使用容器的过程很清楚地揭示了在IoC容器实现中的那些关键的类(比如Resource、DefaultListableBeanFactory以及BeanDefinitionReader)之间的相互关系,例如它们是如何把IoC容器的功能解耦的,又是如何结合在一起为IoC容器服务的,等等。在代码清单2-3中可以看到编程式使用IoC容器的过程。代码清单2-3 编程式使用IoC容器1. ClassPathResourceres=newClassPathResource(beans.xml);DefaultListableBeanFactory 2. factory=newDefaultListableBeanFactory(); 3. XmlBeanDefinitionReaderreader= 4. newXmlBeanDefinitionReader(factory); 5. reader.loadBeanDefinitions(res);这样,我们就可以通过factory对象来使用 DefaultListableBeanFactory这个IoC容器了。在使用IoC容器时,需要如下几个步骤:1)创建IoC配置文件的抽象资源,这个抽象资源包含了BeanDefinition的定义信息。2)创建一个BeanFactory,这里使用DefaultListableBeanFactory。3)创建一个载入BeanDefin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 忻州市人民医院影像副主任医师资格评审
- 鹤岗市人民医院血液净化设备日常维护与质控考核
- 收发员岗前品质考核试卷含答案
- 2025机械工程师综合素质与技能历年真题及答案
- 松香蒸馏工班组协作模拟考核试卷含答案
- 大同市人民医院肝胆外科年度综合能力考核
- 2025分级护理制度考试试题(+答案)
- 聚乙烯醇制造工诚信模拟考核试卷含答案
- 临汾市中医院RICU护士准入资格危重病人监护技能考核
- 网络安全防御技术考核试卷及答案
- 2024-2030年全球汽车级智能座舱SoC芯片行业现状、重点企业分析及项目可行性研究报告
- 冠状动脉微血管疾病诊断和治疗中国专家共识(2023版)解读
- 菇棚空调机组安装施工方案
- 劳务外包服务投标方案(技术标)
- 生鲜乳质量安全
- 建筑施工危险性较大工程验收表
- 新加坡《合成数据生成指南》
- 人教版三年级上册语文期中测试题试卷(含答案)
- 《加油站消防安全教育》培训
- 汽车智能制造技术课件
- 辽宁省沈阳市郊联体2024-2025学年高三上学期11月期中数学试卷(含答案)
评论
0/150
提交评论