Spring源码学习IOC小结

结合Spring源码说明了Spring的实现原理,对容器的实现原理进行了详细的分析,其中包括了:IOC容器和上下文的基本工作原理、容器的初始化过程、依赖注入的实现等等。主要包括了以下几个方面:

  • BeanDefinition的定位:对IOC容器来说,它为管理POJO之间的依赖关系提供了帮助,但也要依据Spring的定义规则提供Bean定义信息。我们可以使用各种形式的Bean定义信息,其中比较熟悉的是使用XML的文件格式。在Bean定义方面,Spring为用户提供了很大的灵活性。在初始化IOC容器的过程中,首先需要定位到这些有效的Bean定义信息。这里使用Resource接口来统一这些Bean定义信息,而这个定位由ResourceLoader来完成。如果使用上下文,ApplicationContext本身九尾客户提供了定位的功能。因为上下文本身就是DefaultResourceLoader的子类。如果使用基本的BeanFactory作为IOC容器,客户需要做的额外工作就是为BeanFactory指定相应的Resource来完成Bean信息的定位。

  • 容器的初始化。在使用上下文时,需要一个对它进行初始化的过程,完成初始化以后,这个IOC容器才是可用的。这个过程的入口是在refresh中实现的,这个refresh相当于容器的初始化函数。在初始化过程中,比较重要的部分是对BeanDefinition信息的载入和注册工作。相当于在IOC容器中需要简历一个BeanDefinition定义的数据映像,Spring为了达到载入的灵活性,把载入的功能从IOC容器中分离出来,由BeanDefinitionReader来完成Bean定义信息的读取、解析和IOC容器内部BeanDefinition的建立。在DefaultListableBeanFactory中,这些BeanDefinition被维护在一个HashMap中,以后的IOC容器对Bean的管理和操作就是通过这些BeanDefinitioni来完成的。

    在容器初始化完成以后,IOC容器的使用就准备好了,单着时只是在IOC容器内部建立了BeanDefinition,具体的依赖关系还没有注入。在客户第一次向IOC容器请求Bean时,IOC容器对相关的Bean依赖关系进行注入。如果需要提前注入,客户可以通过lazy-init属性进行预实例化,这个预实例化是上下文初始化的一部分,起到提前完成依赖注入的控制作用。在依赖注入完成以后,IOC容器就会保持这些具备依赖关系的Bean供客户直接使用。这时可以通过getBean来取得Bean,这些Bean不是简单的Java兑现,而是已经包含了对象之间依赖关系的Bean,尽管这些依赖注入的过程对用户来说是不可见的。
    在对IOC容器的分析中,重点讲解了BeanFactory和ApplicationContext体系、ResourceLoader、refresh初始化、容器的loadBeanDefinition和注册、容器的依赖注入、预实例化和FactoryBean的工作原理,等等,通过对这些实现过程的深入分析,可以初步了解IOC容器的基本工作原理和它的基本特性的实现思路。了解了IOC容器的基本实现原理后,我们对容器的其它特性的实现原理也进行了分析。这些特性包括:init-lazy预实例化、BeanFactory、Bean后置处理器一级autowiring特性的实现。这些特性对我们更灵活的使用IOC容器有很大帮助。但是由于Spring IOC容器的内涵特性非常丰富,这里并没有对其工作原理进行面面俱到的分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值