• BeanFactory容器的设计原理


    XmlBeanFactory设计的类继承关系

    1.BeanFactory接口提供了使用IoC容器的规范。在这个基础上,Spring还提供了符合这个IoC容器接口一系列容器的实现供开发人员使用

    2.我们以XmlBeanFactory的实现为例来说明简单IoC容器设计原理

    3.可以看到,作为一个简单IoC容器系列最底层实现XmlBeanFactory,与我们在Spring应用中用到的上下文相比,有一个非常明显的特点:它提供最基本的IoC容器的功能

    4.理解这一点有助于我们理解ApplicationContext基本BeanFactory之间的区别联系

    5.我们可以认为直接的BeanFactory实现IoC容器的基本形式,而各种ApplicationContext的实现IoC容器的高级表现形式

     

    1.让我们好好看一下上图中的继承关系,从中可以清楚地看到类之间的联系,他们都是IoC容器系列组成部门

    2.在设计这个容器系列时,我们可以从继承体系的发展上看到IoC容器各项功能的实现过程。如果要扩展自己的容器产品,建议读者最好在继承体系中检查一下,看看Spring是不是已经提供了现成的相近的容器实现供我们参考。

    3.下面就从我们比较熟悉的XmlBeanFactory的实现入手进行分析,来看看一个基本的IoC容器怎样实现的

    一个基本的IoC容器是怎样实现的

    1.XmlBeanFactory继承自DefaultListableBeanFactory这个类,后者非常重要,是我们经常要用到的一个IoC容器的实现,比如在设计应用上下文ApplicationContext就会用到它

    2.我们会看到这个DefaultListableBeanFactory实际上包含了基本IoC容器所具有的重要功能,也是在很多地方都会用到的容器系列中的一个基本产品

    3.在Spring中,实际上把DefaultListableBeanFactory作为一个默认功能完整IoC容器使用的。

    4.XmlBeanFactoy在继承了DefaultListableBeanFactory容器的功能的同时,增加了新的功能,这些功能很容易从XmlBeanFactory的名字猜到。他是一个与XML相关的BeanFactory,也就是说是一个可以读取XML文件方式定义的BeanDefinition的IoC容器

    5.这些实现XML读取的功能怎样实现的呢?

    6.对这些XML文件定义信息的处理并不是由XmlBeanFactory直接完成的

    7.在XmlBeanFactory中,初始化了一个XmlBeanDefinitionReader对象,有了这个Reader对象,那些以XML方式定义BeanDefinition就有了处理的地方。

    8.我们可以看到,对这些XML形式的信息的处理实际上是由这个XmlBeanDefinitionReader来完成的。

    1.构造XmlBeanFactory这个IoC容器时,需要指定BeanDefinition的信息来源,而这个信息来源需要封装Spring中的Resource类来给出。

    2.Resource是Spring用来封装I/O操作的类。比如,我们的BeanDefinition信息是以XML文件形式存在的,那么可以使用像“ClassPath-Resourceres = new ClassPathResource("beans.xml");"这样具体的ClassPathResource来构造需要的Resource,然后将Resource作为构造参数传递给XmlBeanFactory构造函数。这样,IoC容器就可以方便地定位到需要的BeanDefinition信息来对Bean完成容器的初始化依赖注入过程

     

     1 public class XmlBeanFactory extends DefaultListableBeanFactory {
     2     private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
     3 
     4     public XmlBeanFactory(Resource resource) throws BeansException {
     5         this(resource, null);
     6     }
     7 
     8     public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactroy)throws BeansException {
     9         super(parentBeanFactory);
    10         this.reader.loadBeanDefinitions(resource);
    11     }
    12 
    13 }
    XmlBeanFactory的实现

    3.XmlBeanFactory的功能是建立在DefaultListableBeanFactory这个基本容器的基础上的,并在这个基本容器的基础上实现了其他诸如XML读取的附加功能。对于这些功能的实现原理,看一看XmlBeanFactory的代码实现就能很容易地理解。

    4.如上面代码清单所示,在XmlBeanFactory构造方法需要得到Resource对象。对XmlBeanDefinitionReader对象的初始化,以及使用这个对象来完成对loadBeanDefinitions的调用,就是这个调用启动从Resource中载入BeanDefinitions的过程LoadBeanDefinitions同时也是IoC容器初始化重要组成部分

     

    1.我们看到XmlBeanFactory使用了DefaultListableBeanFactory作为基类,DefaultListableBeanFactory是很重要的一个IoC实现,在其他IoC容器中,比如ApplicationContext,其实现的基本原理和XmlBeanFactory一样,也是通过持有或者扩展DefaultListableBeanFactory来获得基本的IoC容器的功能的。

    看看编程方式使用IoC容器

    1.参考XmlBeanFactory的实现,我们以编程的方式使用DefaultListableBeanFactory。从中我们可以看到IoC容器使用的一些基本过程。

    2.尽管我们在应用中使用IoC容器时很少会使用这样原始的方式,但是了解一下这个基本过程,对我们了解IoC容器的工作原理是非常有帮助的。

    3.因为这个编程式使用容器的过程,很清楚揭示了在IoC容器实现中的那些关键的类(比如Resource、DefaultListableBeanFatory和BeanDefinitionReader)之间的相互关系,例如它们是如何把IoC容器的功能解耦的,又是如何结合在一起为IoC容器服务的,等等。

    1 ClassPathResource res = new ClassPathResource("beans.xml");
    2     DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
    3     XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
    4     reader.loadBeanDefinition(res);
    编程式使用IoC容器

    这样我们就可以通过factory对象来使用DefaultListableBeanFactory这个IoC容器了。

    在使用IoC容器时,需要如下几个步骤:

    1. 创建IoC配置文件抽象资源,这个抽象资源包含了BeanDefinition的定义信息
    2. 创建一个BeanFactory,这里使用DefaultListableBeanFactory。
    3. 创建一个载入BeanDefinition的读取器,这里使用XmlBeanDefinitionReader来载入XML文件形式的BeanDefinition,通过一个回调配置给BeanFactory
    4. 从定义好的资源位置读入配置信息,具体的解析过程由XmlBeanDefinitionReader来完成。完成整个载入和注册Bean定义之后,需要的IoC容器就建立起来了。这个时候就可以直接使用IoC容器了。
  • 相关阅读:
    itextpd f生成 pdf 文件
    java word文档 转 html文件
    Activiti之 Exclusive Gateway
    activiti入门
    lucene分词器与搜索
    这款小程序 能让你和孙悟空一样 可以七十二变
    西游记中神兽谛听的能力 这款小程序也有
    想拥有一款钢铁侠Jarvis管家的软件吗?
    微信小程序开发填坑指南V1
    NaviSoft31.源码开发完成
  • 原文地址:https://www.cnblogs.com/duffy/p/3941675.html
Copyright © 2020-2023  润新知