Spring源码学习二——容器启动过程下

一、容器启动过程上

书接上回:容器启动过程上

二、容器启动过程下

2.1 invokeBeanFactoryPostProcessors()

在这里插入图片描述
实例化并调用所有注册的BeanFactoryPostProcessor bean,如果给定,则遵循显式顺序。进入getBeanFactoryPostProcessors
在这里插入图片描述
beanFactoryPostProcessors默认是空的

2.1.1 自定义BeanFactoryPostProcessor

在这里插入图片描述
BeanDefinitionRegistryPostProcessor继承至BeanFactoryPostProcessor,将MyBeanFactoryPostProcessor注册到Spring容器中
在这里插入图片描述

2.1.2 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors

进入PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
在这里插入图片描述
这个方法干了挺多事,咱们就不去扣细节了,看注释说的:这个方法看上去很容易重构,以避免它里面使用的多层循环,多个列表,多次调用getBeanNamesForType方法获取beanName。但是我们必须保证这些处理器按照指定的顺序执行。具体来说,我们不能将处理器实例化(通过getBean())调用,或以错误的顺序在ApplicationContext中注册。意思就是搞这么复杂是有必要的。BeanFactoryPostProcesser优先级是

  • 入参 beanFactoryPostProcessors 中的 BeanDefinitionRegistryPostProcessor,自定义容器可添加如Springboot
  • BeanDefinitionRegistryPostProcessor 接口实现类,并且实现了 PriorityOrdered 接口
  • BeanDefinitionRegistryPostProcessor 接口实现类,并且实现了 Ordered 接口
  • 剩余的 BeanDefinitionRegistryPostProcessor 接口实现类
  • 所有 BeanDefinitionRegistryPostProcessor 接口实现类,优先级高的BeanDefinitionRegistryPostProcessor 在执行postProcessBeanDefinitionRegistry方法时,可能会产生更多的definitions,而这些definitions有可能也是一个新的BeanDefinitionRegistryPostProcessor
  • 入参 beanFactoryPostProcessors 中的常规 BeanFactoryPostProcessor
  • 常规 BeanFactoryPostProcessor 接口实现类,并且实现了 PriorityOrdered 接口
  • 常规 BeanFactoryPostProcessor 接口实现类,并且实现了 Ordered 接口
  • 剩余的常规 BeanFactoryPostProcessor 接口的实现类

2.2 registerBeanPostProcessors

注释的意思:注册bean的增强器,拦截bean的创建在这里插入图片描述
跟进去registerBeanPostProcessors
在这里插入图片描述

  • registerBeanPostProcessors 方法主要用于处理 BeanPostProcessor 接口,在 bean 实例化之后,执行初始化方法前后,调用BeanPostProcessor 的两个方法,实现对bean的扩展,BeanPostProcessor 可以拦截到所有的bean。
  • BeanPostProcessor 实现类和 BeanFactoryPostProcessor 实现类一样,可以通过实现 PriorityOrdered、Ordered 接口来调整优先级。
  • registerBeanPostProcessors方法只是将 BeanPostProcessor 实现类注册到 BeanFactory 的 beanPostProcessors (List)中,并不会执行实现类重写的方法

2.3 initMessageSource

在这里插入图片描述
这个方法比较简单,就是初始化信息源对象,如果未定义就使用父类的。MessageSource用于支持信息的国际化和包含参数的信息的替换

2.4 initApplicationEventMulticaster

在这里插入图片描述
初始化事件广播
在这里插入图片描述
使用SimpleApplicationEventMulticaster初始化ApplicationEventMulticaster,如果本容器未自定义。
ApplicationEventMulticaster是一个事件的广播,要理解它,首先要理解spring的监听器机制,继续后面两个方法来看看使用示例和原理

2.5 onRefresh

在这里插入图片描述
这也是一个模板方法给子类实现,放在initApplicationEventMulticaster之后,就是完成applicationEventMulticaster初始化之后,可以在onRefresh方法中添加监听事件

  • 定义一个事件
    在这里插入图片描述
  • 定义一个监听器,监听刚刚的事件(TestEvent)
    在这里插入图片描述
  • 重写onRefresh,将监听器加入到容器
    在这里插入图片描述

在这里插入图片描述
这一步将监听器注册进了ApplicationEventMulticaster.DefaultListenerRetriever(内部类).applicationListeners(Set类型)和AbstractApplicationContext.applicationListeners(容器的缓存Set)

2.6 registerListeners

在这里插入图片描述

  • registerListeners会将AbstractApplicationContext.applicationListeners再次放入ApplicationEventMulticaster.DefaultListenerRetriever(内部类).applicationListeners
  • 查找所有实现了ApplicationListener接口的bean,加入ApplicationEventMulticaster.DefaultListenerRetriever(内部类).applicationListenerBeans

到这里完成了监听器的注册,事件发布和监听还需要往下看

2.6.1 发布与广播事件

AnnotationConfigApplicationContext实现了ApplicationEventPublisher,重写了publishEvent方法,下面发布一个事件TestEvent
最终还是调用ApplicationEventMulticaster的multicastEvent方法,将事件广播出去
在这里插入图片描述
进入multicastEvent
在这里插入图片描述
getApplicationListeners通过事件类型匹配到监听器(就是将事件广播出去了),然后循环。可以自定义Executor来添加执行任务,在invokeListener之前。invokeListener将调用监听器的onApplicationEvent方法
在这里插入图片描述
getApplicationListeners的匹配规则就不细扣啦,有兴趣的自行研究

2.7 finishBeanFactoryInitialization

finishBeanFactoryInitialization将实例化所有剩余的非懒加载的单例bean
在这里插入图片描述
单例bean的生命周期后面单独讲

2.8 finishRefresh

发布容器刷新启动成功的事件
在这里插入图片描述
进入
在这里插入图片描述
如果有监听器监听ContextRefreshedEvent,就会触发监听器执行相应的逻辑

三、总结

  1. 刷新前准备,主要是初始化了一些要用到的对象
  2. 设置BeanFactory,配置容器标志特征属性,如类加载器、后置增强等
  3. 预留了一些扩展(postProcessBeanFactory)
  4. 注册并执行BeanFactoryPostProcesser
  5. 注册BeanPostProcesser
  6. 监听机制的广播器初始化,注册监听器到广播器
  7. 完成单例bean的实例化、初始化
  8. 发布容器更新完成事件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值