Spring IOC原理解读:
BeanFactory(管理bean的源头或入口, 核心类:DefaultListableBeanFactory)
BeanDefinition(bean的定义信息,将xml转为java信息,每个对象都包含了bean配置的属性信息)
BeanRegistry(创建bean的地方,类:DefaultSingletonBeanRegistry, 方法:beforeSingletonCreation(beanName))
一、加载容器:beanFactory, applicationContext
1、当new FileSystemXmlApplicationContext的时候,会执行refresh方法。
通过在父级类中AbstractApplicationContext 创建BeanFactory对象
2、然后加载beanDefinition:通过resource加载xml的一些配置文件转化为java对象格式进行管理。
二、初始化及依赖注入:
AbstractApplicationContext在容器加载后,会去实例化所有非延迟加载的单例Bean。在DefaultListableBeanFactory中初始化存于他的list中的beanName,一个个初始化。具体bean的创建步骤:
1、先从DefaultSingletonBeanRegestry中获取bean(先从一级缓存singletonObject中获取,如没有从earlySingletonObject获取,如 没有就从singletonFactory获取如取到就将singtonFactory数据移除,放入到earlySingletonObject)。
2、 当从父级BeanFactory的map中获取到对象时就返回,如果获取不了,则顺着双亲BeanFactory链一直向上找,如果能找到,则返回,还是找不到,就创建,具体创建步骤如下图。
对Bean的创建最为核心三个方法解释如下:
- createBeanInstance:实例化,其实也就是调用对象的构造方法实例化对象
- populateBean:填充属性,这一步主要是对bean的依赖属性进行注入(@Autowired)
- initializeBean:执行init-method、InitializingBean, PostBeanProcessor的前置后置处理,注册bean销毁的回调接口。
内部通过AccessController.doPrivileged生成一个Constructor,然后Constructor.newInstance创建了对象。
下图即为创建bean的过程,也采用了三级缓存解决了循环依赖。(DefaultSingletonBeanRegistry#getSingleton)