springIoc容器创建流程
在AbstractApplicationContext#refresh()中描述了创建ioc的过程
// 1.前期准备校验参数等
prepareRefresh();
// 2.创建beanFactory工厂对象,还把配置文件中的bean转换成
// BeanDefiniton 注册到 BeanDefinitonRegistry中
// 这时还没实例化
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 3.对工厂对象进行优化配置
prepareBeanFactory(beanFactory);
try {
// 4.空方法留给子类实现
postProcessBeanFactory(beanFactory);
// 5.调用工厂后处理器
// 从BeanDefinitonRegistry中找到实现了BeanFactoryPostProcessor的并执行其中的postProcessBeanFactory方法。可以对BeanDefiniton进行修改
invokeBeanFactoryPostProcessors(beanFactory);
// 6.注册bean后置处理器
// 从BeanDefinitonRegistry中找到实现了BeanPostProcessor接口的bean,注册到bean后置处理器的注册表中
registerBeanPostProcessors(beanFactory);
// 7.国际化
initMessageSource();
// 8.初始化广播器
initApplicationEventMulticaster();
// 9.空方法 子类实现
onRefresh();
// 10.加载监听器
registerListeners();
// 11.完成bean的实例化
//初始化所有的单例bean,懒加载的除外,放入spring缓存中
finishBeanFactoryInitialization(beanFactory);
// 12.完成刷新并发布容器刷新事件
// 创建上下文刷新事件,返送广播到监听器
finishRefresh();
}
-
ResourseLoader 从存储介质加载配置文件,用Resourse来表达
-
BeanDefinitonRegistry读取Resourse配置文件,把< bean>解析成BeanDefiniton存放在BeanDefinitonRegistry中
-
容器扫描BeanDefinitonRegistry中BeanDefiniton,得到实现了BeanFactoryPostProcessor接口的bean,然后调用其方法对BeanDefinitonRegistry中BeanDefiniton进行加工。主要进行
(1) 有的bean值是占位符,在此解析后生成完整的BeanDefiniton
(2) 从BeanDefinitonRegistry中扫描实属性编辑器的bean(实现了PropertyEditor接口的bean)并自动将他们注册到spring的PropertyEditorRegistry中 -
取出BeanDefinitonRegistry中的BeanDefiniton并调用InstantionStrategy着手实例化
-
在实例化时,Spring容器使用BeanWrapper对Bean进行封装,里面提供了很多java反射操作bean的方法,结合BeanDefiniton以及容器中的属性编辑器完成注入工作
-
利用容器中注册的Bean后置处理器(实现了BeanPostProcessor接口的Bean)对已经完成了属性设置的bean进行后置加工,直接装配出准备就绪的bean