Spring IOC实现

来源:互联网 发布:马云淘宝 编辑:程序博客网 时间:2024/05/19 18:42

  • IOC实现
    • 一些基本对象
      • 1 BeanFatory接口
      • 2 XmlBeanFactoryxml配置方式
    • IOC初始化BeanDefinition的Resouce定位载入和注册以xml为例
      • 1 定位
      • 2 载入流程图
      • 3 注册
    • 依赖注入
      • 1 依赖注入的实现默认是在getBean被调用的时候触发
    • 容器其他相关特性的实现
      • 1 lazy-init属性和预实例化
      • 2 FactoryBean的实现
      • 3 BeanPostProcessor的实现
      • 4 autowiring的实现


IOC实现

1. 一些基本对象

1.1 BeanFatory(接口)

描述Ioc容器的最基本功能.
BeanDefinition:描述各个对象和对象之间的关系.

1.2 XmlBeanFactory(xml配置方式)

XmlBeanDefinitionReader: 用来读取xml配置文件.
loadBeanDefinitions: 载入BeanDefinitions.

2. IOC初始化(BeanDefinition的Resouce定位,载入和注册):[^以xml为例!]

2.1 定位

resource接口的实现类来完成.

2.2 载入(流程图)

return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray)

*(具体载入委托给BeanDefinitionParserDelegate实现(具体在parseBeanDefinitions()–>parseDefaultElement()–>processBeanDefinition()– >parseBeanDefinitionElement中)

2.3 注册

      在DefaultListableBeanFactory中 BeanDefinitionRegistry()接口 的实现类来完成。

3. 依赖注入

3.1 依赖注入的实现(默认是在getBean()被调用的时候触发)

由DefaultListableBeanFactory的基类AbstractBeanFactory中的getBean()实现.

a.先从缓存中取单例的bean(singleton):因为这种bean请求不需要重复地创建.
b.如果a没取到,则检测IOC中的BeanDefintion是否存在(取不到顺着双亲BeanFactory链一直向上找)
c.取当前bean的所有依赖bean,触发getBean递归调用.
d.区分单例和多例来调用ObjectFactory的createBean().

createBean(在AbstractAutowireCapableBeanFactory中实现):
**具体调用doCreateBean():

*其中BeanWrapper用来持有创建出来的Bean对象(如果是singleton则把缓存中的同名清除).
*createBeanInstance(beanName, mbd, args)返回BeanWrapper创建bean.

—–生成 Bean包含的java对象(多种方式[默认cglib方式(在SimpleInstantiationStrategy中实现)]:属性,构造器等方式,由BeanDefition决定)

*populateBean(实现依赖注入):

—–先对autowire的注入进行处理.
—–再进行属性注入(BeanDefinitionValueResolver对BeanDefinition解析[如果bean是在双亲ioc中就从双亲ioc中取bean,在当前ioc中则直接取:用getBean()取],然后对属性值进行深拷贝再注入[具体的注入由BeanWrapperImpl的setPropertyValues()实现]).

*之后调用initializeBean()返回Object[bean初始化后的对象(包括依赖注入)]

e.对创建出来的bean进行类型检查.

*在依赖注入过程中,多次利用getBean的递归调用(创建bean时递归,注入bean时递归,),在解析的时候也用到了递归.

4.容器其他相关特性的实现

4.1 lazy-init属性和预实例化

reflash中的finishBeanFactoryInitialization封装了对lazy-init属性的处理,实际的处理是DefaultListableBeanFactory的preInstantiateSingletons方法完成(也是用getBean触发依赖注入).

4.2 FactoryBean的实现

1.可用于代理,等.
2.流程:AbstractBeanFactory->getBean()->doGetBean()->getObjectForBeanInstance()->doGetObjectFromFactoryBean()->getObject().
BeanFactory 与 FactoryBean的区别及FactoryBean详解

4.3 BeanPostProcessor的实现

作用
监听容器触发事件(postProcessBeforeInitialization和postProcessAfterInitialization两个接口方法).
具体调用
在3.1中提到的populateBean中initializeBean中被回调.

4.4 autowiring的实现

作用
自动依赖装配.
具体调用
在3.1中提到的populateBean中实现(由getBean()得到bean设置到当前bean的属性中).
原创粉丝点击