【spring源码-4】bean的实例化(1)准备工作

 2023-02-14
原文作者:一支野菊花 原文地址:https://juejin.cn/post/7025149812299268104

上一篇【spring源码-3】xml解析(下)自定义标签解析

引题

上篇回顾:
自定义标签解析流程:

  1. 首先根据标签的 namespaceURI 找到对应的 BeanDefinitionHandler。找的过程就是先把所有jar包里面的 "META-INF/spring.handlers" 文件进行解析并建立 namespaceURI 与 BeanDefinitionHandler 的映射关系,再从映射关系的Map里面根据 namespaceURI 获取到对应的 BeanDefinitionHandler。
  2. 然后调用 BeanDefinitionHandler 的 init 方法,该方法会建立 标签名称 和 对应标签解析类的映射关系,也是一个Map。
  3. 最后找到了标签的解析类,就调用该类的 parse 方法进行具体的标签解析逻辑。
  4. 标签解析完成之后还会有一个操作:注册 PostProcessor,spring 会将一些 PostProcessor 类在完成自定义标签解析之后完成 BD 的注册。

refresh 方法主流程

202301012110470691.png 523 行:创建bean工厂,解析xml文件,注册BeanDefinition。此时spring已经知道了我们需要它管理的类信息。
526 行:给bean工厂设置一些值。

533 行:invokeBeanFactoryPostProcessors(beanFactory)

调用实现了 BeanDefinitionRegistryPostProcessor 接口和 BeanFactoryPostProcessor 接口的类。
点击调用本类方法:

202301012110476242.png 707 行:由 PostProcessorRegistrationDelegate 类完成调用逻辑。方法比较长,如下图:

202301012110482313.png

202301012110532734.png

202301012111045935.png

202301012111057996.png

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 类完成方法调用逻辑。

202301012111063777.png

3. BeanDefinitionRegistryPostProcessor 接口、BeanFactoryPostProcessor 接口的应用

postProcessBeanDefinitionRegistry()、postProcessBeanFactory() 在调用时,bean已经被注册,但是还没有实例化,我们可以自定义实现来操作 bean工厂以及BD对象。

202301012111071308.png

202301012111079889.png

536 行:registerBeanPostProcessors(beanFactory)

完成 BeanPostProcessor 类的实例化并且注册到bean工厂中。

2023010121110852110.png 方法注释 :实例化并注册所有 BeanPostProcessor bean。如果给出,则遵守显式顺序。 必须在应用程序 bean 的任何实例化之前调用。

2023010121110906411.png

2023010121110972912.png 208 行 229 行 241 行:实例化bean。后面会说到。
逻辑与上面 533 行 invokeBeanFactoryPostProcessors(beanFactory) 类似,上面是调用方法,现在是将 BeanPostProcessor 注册到 bean 工厂。

2023010121111027213.png

2023010121111076114.png

542 行:initApplicationEventMulticaster()

初始化事件管理器。
观察者模式

每个事件监听器关注的内容不一样。

2023010121111166515.png 766 行:从bean工厂中获取 ApplicationEventMulticaster 实例。
767 - 768 行:获取到了就设置给当前对应属性,
774 - 775 行:没有获取到实例,就创建一个 SimpleApplicationEventMulticaster 注册到bean工厂。

548 行:registerListeners()

注册事件监听器。

2023010121111227316.png 825 - 828 行:首先注册特定的事件监听器。从上下文对象中获取到指定的监听器,然后完成注册(方式一)。
832 行:然后是通过获取BD的方式注册(方式二)。

自定义事件监听器

创建监听器:

2023010121111380217.png

1. 方式一应用示例

在程序运行过程中注册:

2023010121111429818.png

2. 方式二应用示例

在程序启动时注册:

2023010121111541319.png

2023010121111591420.png

到此,实例化bean的准备工作就已经做完了。

总结

  1. invokeBeanFactoryPostProcessors(beanFactory): 完成 postProcessBeanDefinitionRegistry()、postProcessBeanFactory() 的调用。
  2. registerBeanPostProcessors(beanFactory) 完成 BeanPostProcessor 类的实例化并且注册到bean工厂中。
  3. initApplicationEventMulticaster() 初始化事件管理器。
  4. registerListeners() 注册事件监听器。

注:本文通过源码 + 行说明的方式进行描述,若不好理解可留言。本文仅为个人学习记录,有错误的地方,请大佬们指正。

下一篇【spring源码-5】bean的实例化(2)主逻辑