Spring Ioc容器的实现(一)

Why:        

     最近在看一本叫做《Spring技术内幕》的书籍,主要是想通过研读Spring源码的形式去学习Spring的架构设计思想,现针对书本中的一些要点做一些读书总结。

Spring Ioc容器概述

     目的:解决以往代码高度耦合的问题,将合作对象依赖关系的管理由具体的对象交由Ioc容器来管理,将对象的依赖注入交给框架来处理。

Ioc容器的设计与实现

     Spring Ioc容器的设计中有两个主要的容器,分别为BeanFactory和ApplicationContext.

     BeanFactory:Ioc容器的基本形式,是Ioc容器体系里面最基本的接口。

     应用场景:

           容器附加了某些功能的具体实现:DefaultListableBeanFactory, XmlBeanFactory, ApplicationContext等

          XmlBeanFactory建立在DefaultListableBeanFactory这个基本容器的基础上,实现了XML读取的附加功能。

@Deprecated
@SuppressWarnings({"serial", "all"})
public class XmlBeanFactory extends DefaultListableBeanFactory {

	private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);


	/**
	 * Create a new XmlBeanFactory with the given resource,
	 * which must be parsable using DOM.
	 * @param resource XML resource to load bean definitions from
	 * @throws BeansException in case of loading or parsing errors
	 */
	public XmlBeanFactory(Resource resource) throws BeansException {
		this(resource, null);
	}

	/**
	 * Create a new XmlBeanFactory with the given input stream,
	 * which must be parsable using DOM.
	 * @param resource XML resource to load bean definitions from
	 * @param parentBeanFactory parent bean factory
	 * @throws BeansException in case of loading or parsing errors
	 */
	public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
		super(parentBeanFactory);
		this.reader.loadBeanDefinitions(resource);
	}

}

     2.Application应用上下文(Ioc容器的高级形态,增加了很多面向框架的特性,对应用环境做了很多适配)

     2.1应用场景:

          ApplicationContext是一个高级形态的Ioc容器,在BeanFactory的基础上添加了很多附加功能

          (a)支持不同数据源(扩展MessageSource接口)

          (b)访问资源。对于ResourceLoader和Resource的支持,能够从不同的IO途径得到Bean信息。

         (c)支持应用事件。继承ApplicationEventPublisher接口,为上下文引入事件机制,能够为Bean的生命周期的管理提              供便利 。

     设计原理

         以FileSystemXmlApplicationContext为例介绍ApplicationContext的实现原理。

     关键代码

public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, @Nullable ApplicationContext parent) throws BeansException {
        super(parent);
        this.setConfigLocations(configLocations);
        if(refresh) {
            this.refresh();
        }

    }

          通过在应用上下文的实例过程中调用refresh()方法,引发Ioc容器的一系列操作,不同的应用上下文操作类似,只是各自附加的读取Bean的方式不同,如FileSystemXmlApplicationContext(文件系统载入Resource),ClassPathXmlApplicationContext(Class path路径载入Resource), XmlWebAppicationContext(Web容器中载入Resource)。

Ioc容器的初始化过程

       Ioc的初始化是通过应用上下文中的Refresh()方法来启动的,主要包括三个过程(Resouce定位,载入和注册)

Resource定位  

     Resource定位的过程就是容器寻找数据的过程,寻找BeanDefinition的资源数据。Resource对各种形式的BeanDefinition都提供了统一的接口。如文件系统的Bean信息,则是通过FileSystemResource进行抽象,而类路径的Bean信息则是通过ClassPathResource进行抽象。

    如图所示,FileSystemXmlApplicationContext的继承体系,FileSystemXmlApplicationContext通过继承AbstractApplicationContext类,具备了ResourceLoader的读入以Resource定义的BeanDefinition的能力。在FileSystemXmlApplicationContext的构造函数中通过调用refresh()方法来触发BeanDefinition的资源定位。 

     (1)通过FileSystemXmlApplicationContext构造方法的Refresh()触发Ioc容器初始化。

     (2)在父类AbstractRefreshableApplicationContext中创建了Ioc容器DefaultListableBeanFactory。

     (3)AbstractXmlApplicationContext父类中创建XmlBeanDefinitionReader并定位到Resource(FileSystemResource)形式的BeanDefinition。

Beandefinition的载入和解析

       Beandefinition的载入就是把用户的Bean转换成Bean内部的数据结构(BeanDefinition),Ioc容器对Bean的管理和依赖注入都是通过对BeanDefinition的相关操作而实现。BeanDefinition载入的时序图如下所示:

流程:

(1)AbstractXmlApplicationContext中初始化XmlBeanDefinitionReader读取器,根据BeanDefinition的resouce定位。

(2)在读取器中获取代表xml的Resource(封装了XML文件的IO操作),根据规则对XML的文档树进行解析(由BeanDefinitionParseDelegate负责),获取document对象。

(3)最后通过BeanDefinitionHolder来持有beanDefinition对象,还包括BeanDefinition的使用相关信息,包括bean的名字,别名集合等。

BeanDefinition在Ioc容器的注册

    BeanDefinition的载入和解析已经在Ioc容器中建立起自己的数据结构和相应的数据表示,但此时这些数据还不能够被Ioc容器直接使用,需要在Ioc容器中对这些BeanDefinition进行注册(通过HashMap来持有载入这些BeanDefinition)

     

(1)DefaultbeanDefinitionDocumentReader中调用processBeanDefinition方法,其中parseBeanDefinitionElement将Element转换成BeanDefinitionHolder。

(2)调用registerBeanDefinition方法,将BeanDefinitionHolder注册到Ioc容器中(HashMap的形式)

小结:

最后,Ioc容器初始化完成,Ioc容器DefaultListableBeanFactory机那里器了整个Bean的配置信息,容器可以对持有的BeanDefinition进行检索和使用,这个容器的作用就是对这些信息进行维护和处理,这是简历依赖反转的基础。

      

 

      

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值