上篇文章主要介绍:
先创建applicationEventMulticaster多播(派发)器,再注册registerListener添加到派发器中,之后下篇文章将介绍如何调用spring监听,这篇文章先介绍bean创建,因为监听在bean创建完成之后调用。
Ioc容器refresh总结(4)--- Spring源码从入门到精通(三十四 )
十一、finishBeanFactoryInitialization
- preInstantiateSingletons;初始化剩下的单实例bean。
- 获取容器中的所有bean,依次进行初始化和创建对象。
- 获取bean的定义信息:RootBeanDefination
- Bean不是抽象,是单实例,不是懒加载,则true;
a.判断是否是factoryBean,是否是实现factoryBean接口的;不是工厂bean,则用getBean创建对象(ioc容器的getBean方法)。
b.先从缓存中获取保存了单实例的bean,如果能获取到,说明之前被创建过(所有创建过得单实例bean都会被缓存起来Map<String,Object> singleObjects,这里也就是一级缓存)。
c.缓存中没有的话,开始创建对象流程。
d.markBeanAsCreate()标记当前bean已被创建。(防止多线程的时候创建多个对象导致不是单实例)。
e.获取bean的定义信息。
f.获取当前bean依赖的其他bean。如果存在依赖的bean,通过getBean先创建出来。
g.启动创建单实例流程;
1).创建createBean;
2).resolveBeforeInstantiation。先获取bean,通过提前执行,先执行beanPostProcessorBeforeInstantiation,如果有返回在执行beanPostProcessorAfterInitialization。
3)如果beanPostProcessorBeforeInstantiation没有返回代理对象,则开始下面的创建bean。
前面都是预处理,下面开始正式创建bean
4)doCreateBean()方法内需要做的如下:
a、创建bean实例,createBeanInstance利用工厂方法或者对象构造器创建bean实例,里面会determineCandidateConstruct推断使用啥构造器之前。
b、调用postProcessMergedBeanDefination预处理@Autowired@Value
c、先调用getEarlyBeanReference提早获取bean,防止循环依赖。populate给bean赋值,调用postProcessPropertyValue给bean属性赋值。
接下来开始bean的初始化
d、initializeBean初始化bean,先执行invokeAwareMethods,执行aware接口的方法。如果组件实现了这些接口beanNameAware,beanClassLoaderAware,beanFactoryAware,则会回调。
e、调用后置处理器beanPostProcessBeforeInitialization调用bean初始化之前的方法。(此处可以实现initializaingBean接口,可以注解@PostConsrtuct,或者和@bean一起用init-method)
f、invokeInitMethods,
1)、判断是否是实现initializaingBean接口初始化。
2)、是否自定义初始化。
g、调用后置处理器beanPostProcessAfterInitizlization调用bean初始化之后的方法。(bean初始化就完成了)
bean初始化完成后注册bean的销毁方法
h、注册bean的销毁方法(只是注册,调用的时候是容器销毁时候才调用)
beanPostProcessDestruction,@PreDestory,DisposableBean,destory-method调用。
Bean对象创建出来之后调用addSingleton()方法,将创建的bean添加到一级缓存中。
1、先在初始化对象之前(填充populate对象之前)addSingletonFactory放在三级缓存,并清空二级缓存earlySingleton。在后面getSingleton方法里会清空三级缓存,放入二级缓存earlySingleton。最后bean创建成功会放入一级缓存中。