Spring容器创建过程
Spring容器的refresh()【创建刷新】
1. prepareRefresh() 刷新前的预处理
1.1 initPropertySources() 初始化一些属性;子类自定义个性化的属性设置
1.2 getEnvironment().validateRequiredProperties();检验属性的合法等
1.3 this.earlyApplicationEvents = new LinkedHashSet<>();保存容器中的一些早期的事件
2.obtainFreshBeanFactory(); 获取bean工厂
2.1 this.beanFactory=new DefaultListableBeanFactory();在GenericApplicationContext的无参构造中。
2.2 this.beanFactory.setSerializationId(getId()); 设置序列化Id
2.3 getBeanFactory 返回刚才GenericApplicationContext创建的BeanFactory对象
3.prepareBeanFactory(beanFactory); beanFactory的预准备工作
3.1 设置beanFactory的类加载器、表达式解析器
3.2 添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
3.3 设置忽略的自动装配的接口
3.4 注册可以解析的自动装配
3.5 添加BeanPostProcessor【ApplicationListenerDetector】
4.postProcessBeanFactory(beanFactory); BeanFactory准备工作完成后的后置处理
4.1 但是这是一个空方法 代表子类可以通过重写这个方法在BeanFactory创建并预准备完成以后做进一步的设置
=======================以上是BeanFactory的创建以及预准备工作============================
5. invokeBeanFactoryPostProcessors(beanFactory); 执行beanFactoryPostProcessor
5.1 先执行实现了PriorityOrdered优先级接口的注册表后置处理器
5.2 再执行实现了ordered顺序接口的注册表后置处理器
5.3 最后执行没有实现任何优先级或者是顺序接口的注册表后置器
5.4 再执行BeanFactoryPostProcessor的方法 与上面类似
6. registerBeanPostProcessors(beanFactory); 注册Bean后置处理器
BeanPostProcessor
DestructionAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor
SmartInstantiationAwareBeanPostProcessor
MergedBeanDefinitionPostProcessor【internaPostProcessor】
不同接口类型的BeanPostProcessor在Bean创建前后的执行时期是不一样的 后置处理器都默认可以有优先级
6.1 获取所有的BeanPostProcessor;
6.2 先注册PriorityOrdered优先级的BeanPostProcessor