首页 > 代码库 > spring源码:IOC(li)

spring源码:IOC(li)

一、BeanDefinition

  BeanDefinition是配置文件<bean>元素标签在容器中内部表示形式。创建最终的BeanDefinition主要包括两个步骤:
    1)利用BeanDefinitionReader对配置信息Resource进行读取,通过XML解析器解析配置信息的DOM对象,简单地为每个<bean>生成对应的BeanDefinition对象。但是这里生成的BeanDefinition可能是半成品,因为在配置文件中,我们可能通过占位符变量引用外部属性文件的属性,这些占位符变量在这一步还没有被解析出来。
    2)利用容器中注册的BeanFactoryPostProcessor对半成品的BeanDefinition进行加工处理,将以占位符表示的配置解析为最终的实际值,这样半成品的BeanDefinition就为成品的。

二、FactoryBean和BeanFactory

  一个是Factory,也就是IoC容器或对象工厂;一个是Bean。在Spring中,所有Bean都是由BeanFactory(也就是IoC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能产生或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。BeanFactory接口设计了getBean方法,这个方法是使用IoC容器API的主要方法,Bean的取得是通过指定名字来进行索引的。

  BeanFactory继承体系http://mydream1987.iteye.com/blog/1151380

  AutowireCapableBeanFactory→AbstractAutowireCapableBeanFactory→DefaultListableBeanFactory→XmlBeanFactory IoC容器的实现系列。XmlBeanFactory这个IoC容器可以读取以XML形式定义的BeanDefinition。

@Deprecatedpublic 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);    } }

  编程式使用IOC容器:

ClassPathResource res = new ClassPathResource("beans.xml");DefaultListableBeanFactory factory = new DefaultListableBeanFactory();XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);reader.loadBeanDefinitions(res);

三、IOC容器初始化

  IoC容器的初始化包括BeanDefinition的Resouce定位、载入和注册这三个基本的过程。Spring容器的初始化主要分为三个步骤,分别使Bean信息的定位,解析与注册。以XML文件形式的Bean信息为例,Spring首先找到XML文 件的位置,然后读取此文件,并且将文件解析成相应的BeanDefinition,最后将获取到的BeanDefinition注册到BeanFactory中去。

技术分享

这副顺序图中我们可以看出,Spring容器的初始化过程主要由四个类来完成,我们可以参考下类的注释以了解这几个类的职责:

  1. XmlBeanDefinitionReader:用于XML Bean定义信息的BeanDefinitionReader,将事实上的XML文件读取代理给BeanDefinitionDocumentReader接口的一个实现。
  2. BeanDefinitionDocumentReader:用于解析Spring Bean定义信息的服务提供接口(SPI),在实际解析DOM文档的时候,由XmlBeanDefinitionReader来调用。
  3. BeanDefinitionParserDelegate:用于解析XML Bean定义信息的有状态代理类。负责一个Bean的定义信息解析策划能够BeanDefinition对象。
  4. BeanDefinitionRegistry:负责将得到的Bean定义信息注册到BeanFactory中。

四、

spring源码:IOC(li)