Spring源码分析总结——容器的功能扩展

该文章基于《Spring源码深度解析》撰写,感谢郝佳老师的奉献

BeanFactoryPostProcessor注册

PostProcessorRegistrationDelegate类invokeBeanFactoryPostProcessors方法 ——实际上就是调用了我们已经写好的BeanFactoryPostProcessor后处理器。

只不过它首先将beanfactory按照类型分为了:BeanDefinitionRegistry类型的BeanFactory和其他类型的BeanFactory,对于BeanDefinitionRegistry类型的BeanFactory的处理比较复杂,Spring框架将后处理器分为了三种类型:
1.通过硬编码方式注册的BeanDefinitionRegistryPostProcessor类型的后处理器
2.通过硬编码方式注册的BeanFactoryPostProccessor类型的后处理器
3.通过配置方式注册的BeanDefinitionRegistryPostProcessor后处理器
而对于BeanDefinitionRegistryPostProcessor类型的后处理器需要先进行特殊处理

需要注意的是:对于硬编码的后处理器不用进行排序,而对于配置文件中注册的后处理器,需要进行排序之后再调用

BeanPostProcessor注册

PostProcessorRegistrationDelegate类registerBeanPostProcessors方法——用于注册BeanPostProcessor处理器
BeanPostProcessor相比较于BeanFactoryPostProcessor有一个显著的不同就在于BeanPostProcessor允许自动注册,但是要注意如果想要使用自动注册的功能就要使用ApplicationContext进行获取Bean。在这个方法也是先将BeanPostProcessor进行了分别注册:
1.注册所有实现PriorityOrdered的BeanPostProcessor
2.注册所有实现Ordered的BeanPostProcessor
3.注册所有无序的的BeanPostProcessor
4.注册所有MergedBeanDefinitionPostProcessor类型的BeanPostProcessor(会先移除之前已经存在的BeanPostProcessor)

BeanFactoryPostProcessor与BeanPostProcessor的不同在于前者存在硬编码(因为需要马上调用),后者只采用配置文件的方式(不需要马上调用)

消息资源初始化

MessageSource类结构图
Spring源码分析总结——容器的功能扩展

资源文件的获取主要位于AbstractApplicationContext类的initMessageSource方法中,只需要注意的是Spring中通过硬编码要求Bean的Id必须为messageSource。

初始化ApplicationEventMulticaster

只要实现了ApplicationListerner接口的bean都可以作为监听器使用,通过AbstractApplication类initApplicationEventMulticaster进行调用,如果用户有自定义的事件广播器那么调用用户自己的事件广播器,否则通过调用SimpleApplicationEventMulticaster类multicastEvent来进行广播,事件监听是典型的观察者模式。当然监听器的注册位于该类的registerListeners方法,该方法将监听器分成了两种类型,一种为硬编码,一种为配置文件

初始化非延迟加载单例

初始化单例依然依赖于AbstractApplicationContext类,只不过是另外一个方法finishBeanFactoryInitialization。该方法在完成了BeanFactory的初始化工作,其中包括了ConversionService的注册,配置冻结,以及非延迟加载Bean的初始化工作

扩展LifeCycle接口

扩展LifeCycle接口是ApplicationContext进行扩展的最后一步,由finishiRefresh方法实现,该方法通过ApplicationEventMulticaster来发布事件,从而保证对应监听器可以进行下一步操作。