10分钟详解Spring全家桶“7大知识点”( 四 )


refresh方法中 , 操作共分13步:
第1步:对刷新进行准备 , 包括设置开始时间、设置激活状态、初始化context环境中的占位符 , 这个动作根据子类的需求由子类来执行 , 然后验证是否缺失必要的properties;
第2步:刷新并获得内部的bean factory;
第3步:对bean factory进行准备工作 , 比如设置类加载器和后置处理器、配置不进行自动装配的类型、注册默认的环境bean;
第4步:为context的子类提供后置处理bean factory的扩展能力 。如果子类想在bean定义加载完成后 , 开始初始化上下文之前做一些特殊逻辑 , 可以复写这个方法;
第5步 , 执行context中注册的bean factory后缀处理器;
注:这里有两种后置处理器 , 一种是可以注册bean的后缀处理器 , 另一种是针对bean factory进行处理的后置处理器 。执行的顺序是 , 先按优先级执行可注册bean的处理器 , 在按优先级执行针对beanfactory的处理器 。
对springboot来说 , 这一步会进行注解bean definition的解析 。流程如右面小框中所示 , 由ConfigurationClassPostProcessor触发、由ClassPathBeanDefinitionScanner解析并注册到bean factory 。
第6步:按优先级顺序在beanfactory中注册bean的后缀处理器 , bean后置处理器可以在bean初始化前、后执行处理;
第7步:初始化消息源 , 消息源用来支持消息的国际化;
第8步:初始化应用事件广播器 。事件广播器用来向applicationListener通知各种应用产生的事件 , 是一个标准的观察者模式;
第9步 , 是留给子类的扩展步骤 , 用来让特定的context子类初始化其他的bean;
第10步 , 把实现了ApplicationListener的bean注册到事件广播器 , 并对广播器中的早期未广播事件进行通知;
第11步 , 冻结所有bean描述信息的修改 , 实例化非延迟加载的单例bean;
第12步 , 完成上下文的刷新工作 , 调用LifecycleProcessor的onFresh()方法以及发布ContextRefreshedEvent事件;
第13步:在finally中 , 执行第十三步 , 重置公共的缓存 , 比如ReflectionUtils中的缓存、AnnotationUtils中的缓存等等;
至此 , spring的context初始化完成 。这里仅介绍了最主要的主流程 , 建议课后阅读源码来复习这个知识点 , 补全细节 。
五:Spring中bean的生命周期

10分钟详解Spring全家桶“7大知识点”

文章插图
 
Spring中bean的生命周期
面试中经常问到的bean的生命周期 , 先看绿色的部分 , bean的创建过程:
第1步:调用bean的构造方法创建bean;
第2步:通过反射调用setter方法进行属性的依赖注入;
第3步:如果实现BeanNameAware接口的话 , 会设置bean的name;
第4步:如果实现了BeanFactoryAware , 会把bean factory设置给bean;
第5步:如果实现了ApplicationContextAware , 会给bean设置ApplictionContext;
第6步:如果实现了BeanPostProcessor接口 , 则执行前置处理方法;
第7步:实现了InitializingBean接口的话 , 执行afterPropertiesSet方法;
第8步:执行自定义的init方法;
第9步:执行BeanPostProcessor接口的后置处理方法 。
这时 , 就完成了bean的创建过程 。
在使用完bean需要销毁时 , 会先执行DisposableBean接口的destroy方法 , 然后在执行自定义的destroy方法 。
这部分也建议阅读源码加深理解 。
六:Spring扩展接口
10分钟详解Spring全家桶“7大知识点”

文章插图
 
Spring扩展接口
对spring进行定制化功能扩展时 , 可以选择如下一些扩展点:
▌1.BeanFactoryPostProcessor
是beanFactory后置处理器 , 支持在bean factory标准初始化完成后 , 对bean factory进行一些额外处理 。在讲context初始化流程时介绍过 , 这时所有的bean的描述信息已经加载完毕 , 但是还没有进行bean初始化 。例如前面提到的PropertyPlaceholderConfigurer , 就是在这个扩展点上对bean属性中的占位符进行替换 。
▌2.BeanDefinitionRegistryPostProcessor
它扩展自BeanFactoryPostProcessor , 在执行BeanFactoryPostProcessor的功能前 , 提供了可以添加bean definition的能力 , 允许在初始化一般bean前 , 注册额外的bean 。例如可以在这里根据bean的scope创建一个新的代理bean 。


推荐阅读