1.初始化bean容器工厂DefaultListableBeanFactory
2.从xml,注解等收集bean的定义信息,缓存在BeanDefinition中,包含了spring中所有的元数据
3.BeanFactoryPostProcess扩展(此处进行bean定义信息扩展,占位符替换。属性值修改等等一列初始化bean之前的扩展操作)(所有实现了BeanFactoryPostProcess接口的类全部在此实例化)
4.BeanPostProcesvs扩展,所有实现了BeanFactoryPostProcess接口的类全部再次实例化。并放入BeanPostProcess容器
5.初始化事件发布者,所有实现了ApplicationListener的接口全部再次实例化,并放入ApplicationListener容器,等待执行事件。
6.剩余所有未实例化的bean全部在此实例化。
6.1 获取beanDefinition信息准备进行实例化操作
6.2 cglib实例化对象
6.3 将实例化后的半成品对象提前放入3级缓存中,用来解决可能出现的循环依赖问题
6.5Bean属性的填充
6.5.1循环处理所有的BeanFactory.postProcessProPertyValues(),包括@Autowire注解注入,主要处理注解注入(会有循环依赖)
6.5.2 xml中bean的value信息开始进行赋值(主要处理xml配置)(会有循环依赖)
6.6开始执行init方法。
6.6.1 调用Aware方法,包括BeanNameAware,BeanFactoryAware等等
6.6.2 调用ApplicationContecntAware方法,将上下文设置到Bean中。
6.6.3 调用BeanPostProcess.before()(循环调用)
6.6.4调用InitializingBean的afterPropertiesSet()方法,做一些初始化操作
6.6.5调用BeanPostProcess.after()方法(循环调用)
6.7注册DisPosableBean注销方法,待容器销毁时执行
6.8将成品bean放入1级缓存,如果不存在循环依赖,那么此时的bean在3级缓存中,通过ObjectFactory.getObject()获取出普通bean,然后放入1级缓存,如果存在循环依赖,此时的bean已经被注入对象提前执行了ObjectFactory.getObject(),并放入了2级缓存。目标bean只需要从2,3级缓存中获取出来然后放入1级缓存。
说明:ObjectFactory.getObject()如果是普通bean,那么getObject返回的就是当前Bean对象,如果是Aop代理,那么getObject获取到的是一个Aop代理对象,例如@Transactional,@Aspect有关的注解
6.8最后开始处理FactoryBean对象,getObjectForBeanInstance方法中处理FactoryBean.getObject()获取然后注入到factoryBeanObjectCache缓存中,然后返回getObject()对象。
说明:(此时容器中有2个对象,一个是实现FactoryBean本身的bean在spring1级缓存中国,另一个是getObject返回的对象。在factoryBeanObjectCache缓存中,当执行getBean("name")的时候返回的是factoryBeanObjectCache缓存中的值。如果想返回本身,可以通过getBean("&name")返回)