上一篇【spring源码-3】xml解析(下)自定义标签解析
引题
上篇回顾:
自定义标签解析流程:
- 首先根据标签的 namespaceURI 找到对应的 BeanDefinitionHandler。找的过程就是先把所有jar包里面的 "META-INF/spring.handlers" 文件进行解析并建立 namespaceURI 与 BeanDefinitionHandler 的映射关系,再从映射关系的Map里面根据 namespaceURI 获取到对应的 BeanDefinitionHandler。
- 然后调用 BeanDefinitionHandler 的 init 方法,该方法会建立 标签名称 和 对应标签解析类的映射关系,也是一个Map。
- 最后找到了标签的解析类,就调用该类的 parse 方法进行具体的标签解析逻辑。
- 标签解析完成之后还会有一个操作:注册 PostProcessor,spring 会将一些 PostProcessor 类在完成自定义标签解析之后完成 BD 的注册。
refresh 方法主流程
523 行:创建bean工厂,解析xml文件,注册BeanDefinition。此时spring已经知道了我们需要它管理的类信息。
526 行:给bean工厂设置一些值。
533 行:invokeBeanFactoryPostProcessors(beanFactory)
调用实现了 BeanDefinitionRegistryPostProcessor 接口和 BeanFactoryPostProcessor 接口的类。
点击调用本类方法:
707 行:由 PostProcessorRegistrationDelegate 类完成调用逻辑。方法比较长,如下图:
1. BeanDefinitionRegistryPostProcessor 接口
86 - 87 行:获取实现了 BeanDefinitionRegistryPostProcessor 接口的所有类的 BeanDefinition 对象的beanName。
88 - 93 行:循环这些BD,把实现了排序接口(PriorityOrdered)的 BeanDefinition 筛选出来。
94 行:把筛选出来的实现了排序接口的BD进行排序。
96 行:排序之后调用这些类的 postProcessBeanDefinitionRegistry() 方法。
99 - 110 行:与上面一样,区别是把实现了排序接口(Ordered)的 BeanDefinition 筛选出来。
112 - 118 行:最后处理没实现排序接口的BeanDefinition。
130 - 132 行:调用上述 BeanDefinition 的 postProcessBeanFactory() 方法。
2. BeanFactoryPostProcessor 接口
142 - 186 行:逻辑与 上面 eanDefinitionRegistryPostProcessor 接口类似。
由 PostProcessorRegistrationDelegate 类完成方法调用逻辑。
3. BeanDefinitionRegistryPostProcessor 接口、BeanFactoryPostProcessor 接口的应用
postProcessBeanDefinitionRegistry()、postProcessBeanFactory() 在调用时,bean已经被注册,但是还没有实例化,我们可以自定义实现来操作 bean工厂以及BD对象。
536 行:registerBeanPostProcessors(beanFactory)
完成 BeanPostProcessor 类的实例化并且注册到bean工厂中。
方法注释 :实例化并注册所有 BeanPostProcessor bean。如果给出,则遵守显式顺序。 必须在应用程序 bean 的任何实例化之前调用。
208 行 229 行 241 行:实例化bean。后面会说到。
逻辑与上面 533 行 invokeBeanFactoryPostProcessors(beanFactory) 类似,上面是调用方法,现在是将 BeanPostProcessor 注册到 bean 工厂。
542 行:initApplicationEventMulticaster()
初始化事件管理器。
观察者模式
每个事件监听器关注的内容不一样。
766 行:从bean工厂中获取 ApplicationEventMulticaster 实例。
767 - 768 行:获取到了就设置给当前对应属性,
774 - 775 行:没有获取到实例,就创建一个 SimpleApplicationEventMulticaster 注册到bean工厂。
548 行:registerListeners()
注册事件监听器。
825 - 828 行:首先注册特定的事件监听器。从上下文对象中获取到指定的监听器,然后完成注册(方式一)。
832 行:然后是通过获取BD的方式注册(方式二)。
自定义事件监听器
创建监听器:
1. 方式一应用示例
在程序运行过程中注册:
2. 方式二应用示例
在程序启动时注册:
到此,实例化bean的准备工作就已经做完了。
总结
- invokeBeanFactoryPostProcessors(beanFactory): 完成 postProcessBeanDefinitionRegistry()、postProcessBeanFactory() 的调用。
- registerBeanPostProcessors(beanFactory) 完成 BeanPostProcessor 类的实例化并且注册到bean工厂中。
- initApplicationEventMulticaster() 初始化事件管理器。
- registerListeners() 注册事件监听器。
注:本文通过源码 + 行说明的方式进行描述,若不好理解可留言。本文仅为个人学习记录,有错误的地方,请大佬们指正。