spring 源码分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();

猜你喜欢

转载自blog.csdn.net/qq_31307269/article/details/86479504