Spring的IoC容器基本工作原理
2014-08-07 10:31
225 查看
关于Srping IoC容器的基本工作原理,大致分为BeanDefinition的定位、IoC容器初始化、依赖注入三个过程,具体说明如下:
BeanDefinition的定位。对IoC容器来说,它为管理POJO之间的依赖关系提供了帮助,但也要依据Spring的定义规则提供bean定义信息。我们可以使用各种形式的bean定义信息,其中比较常用的是以XML的形式定义。在bean定义方面,Spring为用户提供了很大的灵活性。在初始化IoC容器的过程中,首先要定位到这些有效的Bean定义信息,Spring使用Resource来统一Bean定义信息,而定位有ResourceLoader完成。如果使用上下文,ApplicationContext为用户提供了定位的功能。因为上下文本身就是DefaultResourceLoader的子类,IoC容器接口的设计图下图所示。如果使用基本的BeanFactory作为IoC容器,客户需要手工为BeanFactory指定相应的Resource来定位Bean信息。
IoC容器的初始化。在使用上下文时,需要先对它进行初始化,完成初始化后,才能对IoC进行使用。初始化的入口就是refresh()函数,它相当于容器的初始化函数。在初始化过程中,比较重要的部分是对BeanDefinition信息的载入和注册工作。相当于在IoC容器中建立一个BeanDefinition定义的数据映像,Spring为了达到载入的灵活性,把载入的功能从IoC容器中分离出来,由BeanDefinitionReader来完成Bean定义信息的读取、解析和IoC容器内部BeanDefinition的建立。在DefaultListableBeanFactory中,这些BeanDefinition被维护在一个HashMap中,以后的IoC容器对Bean的管理和操作都是通过这些BeanDefinition来完成的。
依赖注入。在容器初始化完成后,IoC容器的使用就准备好了,但这只是在IoC容器内部建立了BeanDefinition,具体的依赖关系还没有注入,用户在第一次向IoC容器请求bean时,IoC容器对相关的bean依赖关系进行注入。如果需要提前注入,用户可通过lazy-init属性进行预实例化,这个预实例化是上下文初始化的一部分,起到提前完成依赖关系注入的控制作用,在依赖注入完成后,IoC容器就会保持这些具备依赖关系的bean直接供用户使用,这时,可通过getBean来获取具体的bean实例,这些bean不是简单的java对象,而是包含了对象之间依赖关系的bean,尽管这些依赖注入对于用户来说都是透明的。
图1 IoC容器接口设计图
BeanDefinition的定位。对IoC容器来说,它为管理POJO之间的依赖关系提供了帮助,但也要依据Spring的定义规则提供bean定义信息。我们可以使用各种形式的bean定义信息,其中比较常用的是以XML的形式定义。在bean定义方面,Spring为用户提供了很大的灵活性。在初始化IoC容器的过程中,首先要定位到这些有效的Bean定义信息,Spring使用Resource来统一Bean定义信息,而定位有ResourceLoader完成。如果使用上下文,ApplicationContext为用户提供了定位的功能。因为上下文本身就是DefaultResourceLoader的子类,IoC容器接口的设计图下图所示。如果使用基本的BeanFactory作为IoC容器,客户需要手工为BeanFactory指定相应的Resource来定位Bean信息。
IoC容器的初始化。在使用上下文时,需要先对它进行初始化,完成初始化后,才能对IoC进行使用。初始化的入口就是refresh()函数,它相当于容器的初始化函数。在初始化过程中,比较重要的部分是对BeanDefinition信息的载入和注册工作。相当于在IoC容器中建立一个BeanDefinition定义的数据映像,Spring为了达到载入的灵活性,把载入的功能从IoC容器中分离出来,由BeanDefinitionReader来完成Bean定义信息的读取、解析和IoC容器内部BeanDefinition的建立。在DefaultListableBeanFactory中,这些BeanDefinition被维护在一个HashMap中,以后的IoC容器对Bean的管理和操作都是通过这些BeanDefinition来完成的。
依赖注入。在容器初始化完成后,IoC容器的使用就准备好了,但这只是在IoC容器内部建立了BeanDefinition,具体的依赖关系还没有注入,用户在第一次向IoC容器请求bean时,IoC容器对相关的bean依赖关系进行注入。如果需要提前注入,用户可通过lazy-init属性进行预实例化,这个预实例化是上下文初始化的一部分,起到提前完成依赖关系注入的控制作用,在依赖注入完成后,IoC容器就会保持这些具备依赖关系的bean直接供用户使用,这时,可通过getBean来获取具体的bean实例,这些bean不是简单的java对象,而是包含了对象之间依赖关系的bean,尽管这些依赖注入对于用户来说都是透明的。
图1 IoC容器接口设计图
相关文章推荐
- 1000行代码读懂Spring(一)- 实现一个基本的IoC容器
- Spring IOC容器的基本应用
- Spring——IOC容器基本概念
- Spring参考手册-第三章 IoC容器-3.2 基本概念-容器和Beans(豆子)
- 1000行代码读懂Spring- 实现一个基本的IoC容器
- 1000行代码读懂Spring(一)- 实现一个基本的IoC容器
- Spring源码解析:IoC容器的基本结构设计
- 深入学习Spring源码---基本IOC容器初始化
- springIOC容器基本用法
- Spring源代码解析(一):IOC容器
- Spring AOP 和 IOC 容器入门
- Spring反转容器IOC
- 为什么说Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架?
- spring实例化IOC容器
- Spring--初始化IOC容器的几种方式
- 在Spring的IoC容器中装配AOP代理
- Spring.Net IoC容器+Observer模式
- Castle IOC容器与Spring.NET配置之比较
- 在Servlet(或者Filter,或者Listener)中使用spring的IOC容器
- Spring IoC容器-编码方式比较