Spring源码(二):Spring在Bean实例化前的操作

103 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作。

Spring在Bean实例化前的操作 一、invokeBeanFactoryPostProcessors 二、registerBeanPostProcessors 三、initApplicationEventMulticaster和registerListeners

    上一篇 Spring解析XML文件构建BeanDefinition对象介绍了BeanDefinition对象的构建与注册,但是还没有涉及到bean的实例化,这一篇先来看下bean实例化之前做了哪些事情。其中,国际化可以忽略,onRefresh方法是给子类去实现的。

image.png

一、invokeBeanFactoryPostProcessors

    这个方法中找到所有实现了BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor接口的类,提前实例化,排序后调用BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法和BeanFactoryPostProcessor的postProcessBeanFactory方法。
  • BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法可以完成BeanDefinition的增删改查,如下图所示。

image.png

  • BeanFactoryPostProcessor接口是BeanDefinitionRegistryPostProcessor接口的父接口,它的postProcessBeanFactory方法参数是beanFactory,可以对beanFactory的属性进行修改,也能强转为BeanDefinitionRegistry,实现BeanDefinitionRegistry的一些功能。

image.png

二、registerBeanPostProcessors

    registerBeanPostProcessors方法中首先找到所有实现了BeanPostProcessor接口的类,经历了提前实例化、排序等操作后,最终加入到了BeanFactory的beanPostProcessors容器。

上一篇介绍了,在component-scan标签解析过程中,最后注册了ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor。其中,AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor实现了BeanPostProcessor接口。

image.png

image.png

三、initApplicationEventMulticaster和registerListeners

    initApplicationEventMulticaster方法构造了SimpleApplicationEventMulticaster监听器容器对象,并把它放入一级缓存中。
    监听器容器的使用在registerListeners,该方法获取所有实现了ApplicationListener接口的带有@Component注解的监听器,然后将监听器添加到applicationEventMulticaster。当然,也可以用applicationContext.addApplicationListener手动添加监听器。
    当有监听器对应的事件发布时,会触发监听器,这是典型的观察者设计模式。
    下图是Spring提供的5种标准事件,一般我们只关注ContextRefreshedEvent,这个事件是在finishRefresh中发布的。
    

image.png