文章目录
一、容器启动过程上
书接上回:容器启动过程上
二、容器启动过程下
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,就会触发监听器执行相应的逻辑
三、总结
- 刷新前准备,主要是初始化了一些要用到的对象
- 设置BeanFactory,配置容器标志特征属性,如类加载器、后置增强等
- 预留了一些扩展(postProcessBeanFactory)
- 注册并执行BeanFactoryPostProcesser
- 注册BeanPostProcesser
- 监听机制的广播器初始化,注册监听器到广播器
- 完成单例bean的实例化、初始化
- 发布容器更新完成事件