本文共 1601 字,大约阅读时间需要 5 分钟。
IoC容器是Spring的核心模块,是抽象了对象管理、依赖关系管理的框架解决方案。
在Spring IoC容器的设计中,有两个主要的容器系列,一个是实现了BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本功能;另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在,除了BeanFactory的基本功能,还提供了更多丰富的功能,常用的有ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、XmlWebApplicationContext。
IoC容器的初始化包括BeanDefinition的Resource定位、载入和注册三个基本过程。
一、BeanDefinition的Resource定位(指对BeanDefinition的资源定位过程。通俗地讲,就是找到定义Javabean信息的XML文件,并将其封装成Resource对象)
以FileSystemXmlApplicationContext为例,它间接继承了DefaultResourceLoader类,因此具备了ResourceLoader读入以Resource定义的BeanDefinition的能力。IoC容器的初始化是从它的构造函数中的refresh方法开始的。
二、BeanDefinition的载入和解析(把用户定义好的Javabean表示为IoC容器内部的数据结构,这个容器内部的数据结构就是BeanDefinition)
上文中说到AbstractRefreshableApplicationContext类中refreshBeanFactory方法,启动loadBeanDefinitions来载入BeanDefinition,第一步获得XmlBeanDefinitionReader对象,然后再调用loadBeanDefinitions方法,源码如下:
实际上就是通过XmlBeanDefinitionReader对象去载入和解析BeanDefinition,最后通过BeanDefinitionParserDelegate去解析XML。这个时候容器还没有完全起作用,最后还需完成数据向容器的注册。
三、BeanDefinition在IoC容器中的注册(向IoC容器注册这些BeanDefinition)
跟踪代码,注册其实就是调用DefaultListableBeanFactory里面的registerBeanDefinition方法,本质上是通过HashMap来持有载入的BeanDefinition,即DefaultListableBeanFactory中的beanDefinitionMap。完成了BeanDefinition的注册,就完成了IoC容器的初始化过程。此时,在使用的IoC容器DefaultListableBeanFactory中已经建立了整个Bean的配置信息,而且这些BeanDefinition已经可以被容器使用了。容器的作用就是对这些信息进行处理和维护,这些信息是容器建立依赖反转的基础。
转载地址:http://piwtb.baihongyu.com/