版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31307269/article/details/86479504
曾从多个维度对spring的源码进行分析,试着从理解每个接口开始,但是发现到某一接口的时候还是会不理解该接口的具体作用,又试着从源码的每个细节分析,发现走着走着就迷失了自己,以下是凭自己对spring的理解和源码中对spring整体的一个大概流程
spring容器的整体形成主要靠两个阶段.
第一个阶段: 组装beanDefinition 不管你是xml也好,还是annotation也好,都会将你对类的描述解析成一个一个的beanDefinition然后注册到BeanFactory中去
第二个阶段: 就是调用AbstractApplictionContext的refresh方法,对容器进行初始化刷新.
以下是refresh方法中的操作.
// 上下文刷新前的操作
prepareRefresh();
//刷新 并获取bean工厂
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// bean工厂的一些设置操作 比如 环境变量 Aware接口的自动注入 等等
prepareBeanFactory(beanFactory);
try {
// 预留给子类实现的方法
postProcessBeanFactory(beanFactory);
// 执行实现BeanFactoryPostProcessor接口 以及 实现BeanDefinitionRegistryPostProcessor接口的方法
// 执行顺序 优先执行通过参数 传递进来的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
// 执行实现BeanDefinitionRegistryPostProcessor接口和PriorityOrdered接口的postProcessBeanDefinitionRegistry方法(根据排序结果 数值由小到大)
// 执行实现BeanDefinitionRegistryPostProcessor接口和Ordered接口的postProcessBeanDefinitionRegistry方法(根据排序结果 数值由小到大)
// 执行实现BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法(没有固定的顺序)
// 根据上面的执行顺序 执行 BeanDefinitionRegistryPostProcessor接口的postProcessBeanFactory方法
// 执行通过参数传递进来的只实现了BeanFactoryPostProcessor的接口postProcessBeanFactory方法
// 执行实现BeanFactoryPostProcessor接口和PriorityOrdered接口的postProcessBeanFactory方法(根据排序结果 数值由小到大)
// 执行实现BeanFactoryPostProcessor接口和Ordered接口的postProcessBeanFactory方法(根据排序结果 数值由小到大)
// 执行实现BeanFactoryPostProcessor接口的postProcessBeanFactory方法(没有固定的顺序)
invokeBeanFactoryPostProcessors(beanFactory);
// 注册BeanPostProcessorChecker
// 注册所有的实现了BeanPostProcessor的接口 注册时需要先排序
// 注册所有实现了BeanPostProcessor接口和PriorityOrdered接口的 但没有实现了MergedBeanDefinitionPostProcessor接口的(根据排序结果 数值由小到大)
// 注册所有实现了BeanPostProcessor接口和Ordered接口的 但没有实现了MergedBeanDefinitionPostProcessor接口的(根据排序结果 数值由小到大)
// 注册所有实现了BeanPostProcessor接口 但没有实现了MergedBeanDefinitionPostProcessor接口的
// 注册所有实现了MergedBeanDefinitionPostProcessor接口和PriorityOrdered接口的BeanPostProcessor (根据排序结果 数值由小到大)
// 注册所有实现了MergedBeanDefinitionPostProcessor接口和Ordered接口的BeanPostProcessor (根据排序结果 数值由小到大)
// 注册所有实现了MergedBeanDefinitionPostProcessor接口的BeanPostProcessor
// 注册ApplicationListenerDetector
registerBeanPostProcessors(beanFactory);
// 初始化国际化消息组件
// 查看是否有名称为messageSource的bean 如果没有创建一个 DelegatingMessageSource
// 如果有则采用容器中的messageSource
// 获取父容器中的messageSource 设置给 messageSource的parentMessageSource属性
initMessageSource();
// 初始化应用的事件多播器
// 查看是否有名称applicationEventMulticaster的bean 如果没有创建SimpleApplicationEventMulticaster
// 如果有则采用容器中的applicationEventMulticaster
initApplicationEventMulticaster();
// 留给子类去扩展的方法
onRefresh();
// 将容器中所有实现ApplicationListener接口的类 注册到 事件多播器中
// 如果有未发布的event事件 则将事件发布
registerListeners();
// 完成bean工厂的初始化,并将所有的单例的非懒加载的实例进行初始化(其实就是调用doGetBean方法)
finishBeanFactoryInitialization(beanFactory);
// 完成刷新
// 看容器中是否有名称为lifecycleProcessor的bean 如果没有则创建一个 DefaultLifecycleProcessor
// 如果有则采用容器中的lifecycleProcessor
// 调用lifecycleProcessor的onRefresh方法
// 发布事件 ContextRefreshedEvent
finishRefresh();