Spring 高级特性之二:Processor——Bean生命周期关键触发时机
任何对象都有生命周期,那么Spring Bean对象创建、管理、销毁的整个生命周期个关键触发时机如何体现呢?先说结论,后续案例验证结论。
根据上图可知,实际bean对象涉及生命周期的主要是一个构造器和两个后置处理器(BeanFactoryPostProcessor和BeanPostProcessor)。我们以Dubbo框架为例验证上述结论,注解版配置类如下:
关注@EnableDubbo中涉及bean生命周期的部分,跟踪发现涉及的后置处理器:
beanFactoryPostProcessor有:
DubboConfigAliasPostProcessor
DubboConfigEarlyInitializationPostProcessor
实例化:
时序图:
实例化成功后,在beanfactory单例对象中保存:
那么调用呢?首先看下BeanFactoryPostProcessor接口的具体内容:
那么确定postProcessBeanFactory的调用点即可。调试跟踪如下:
以上跟踪调试分析,可知beanFactoryPostProcessor的实例化及调用均在refresh#invokeBeanFactoryPostProcessors中。
类似,跟踪调试可分析出beanPostProcessor的实例化在refresh#registerBeanPostProcessors中,时序亦类似于beanFactoryPostProcessor。不同于beanFactoryPostProcessor之处在于invokeBeanFactoryPostProcessors中是解析配置文件将待注入到容器中的Bean全部依赖识别暴露出来的过程中进行,而beanPostProcessor是在以上基础上直接实例化——即beanPostProcessor实例化的过程中不在需要识别bean(个人理解)。
关于beanPostProcessor的调用,首先看下BeanPostProcessor接口的具体内容:
其调用在哪里呢?以DubboConfigDefaultPropertyValueBeanPostProcessor这个bean后置处理器为例调试跟踪如下:
上图总在finishBeanFactoryInitialization中初始化registryConfig的过程中调用了beanPostProcessor。
为什么在finishBeanFactoryInitialization中呢?因为此过程的功能就是初始化所有剩下的非懒加载的单例bean,填充属性等。上图中registryConfig就是利用beanPostProcessor赋值填充属性。
BeanPostProcessor的调用可以参考责任链设计模式的相关内容(三、责任链模式 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com))。
BeanPostProcessor与BeanFactoryPostProcessor的初始化、调用的不同时机,正是由于它们的作用不同导致作用域不同决定的。BeanPostProcessor是针对Bean级别的处理,可以针对某个具体的Bean;而BeanFactoryPostProcessor针对整个Bean的工厂(BeanFactory)进⾏处理。可以具化想象成一个是对产品颜色、大小的修饰,一个是对生成产品的流水线进行修饰,比如添加润滑剂使半成品更快流向下一个环节。
关于构造器的使用就赘述了——单例新建的时候都需要用到私有的构造器,这个应该比较容易理解。
Spring 高级特性之二:Processor——Bean生命周期关键触发时机的更多相关文章
- spring(二、bean生命周期、用到的设计模式、常用注解)
spring(二.bean生命周期.用到的设计模式.常用注解) Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的. ...
- 金三银四,还在为spring源码发愁吗?bean生命周期,看了这篇就够了
第一,这绝对是一个面试高频题. 比第一还重要的第二,这绝对是一个让人爱恨交加的面试题.为什么这么说?我觉得可以从三个方面来说: 先说会不会.看过源码的人,这个不难:没看过源码的人,无论是学.硬背.还是 ...
- Spring事务,Bean生命周期
一.事务相关: 1.Spring事务基于Spring AOP切面编程: 2.AOP基于代理模式,得到需要开启事务的代码的代理对象: 3.而没有开启事务的Service方法里调用了开启事务 @Trans ...
- SpringBoot IoC启动流程、初始化过程及Bean生命周期各个阶段的作用
目录 SpringBoot IoC启动流程.初始化过程及Bean生命周期各个阶段的作用 简述 首先明确IoC容器是啥 准备-SpringApplication的实例化 启动-SpringApplica ...
- Spring源码系列 — Bean生命周期
前言 上篇文章中介绍了Spring容器的扩展点,这个是在Bean的创建过程之前执行的逻辑.承接扩展点之后,就是Spring容器的另一个核心:Bean的生命周期过程.这个生命周期过程大致经历了一下的几个 ...
- 手写Spring框架,是时候撸个AOP与Bean生命周期融合了!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 嘎小子,这片代码水太深你把握不住! 在电视剧<楚汉传奇>中有这么一段刘邦 ...
- Spring Bean 生命周期2
在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Sin ...
- Spring bean 生命周期验证
一.从源码注释看bean生命周期 从JDK源码上看,BeanFactory实现类需要支持Bean的完整生命周期,完整的初始化方法及其标准顺序(格式:接口 方法)为: 1.BeanNameAware s ...
- Spring(四)之Bean生命周期、BeanPost处理
一.Bean 生命周期 Spring bean的生命周期很容易理解.当bean被实例化时,可能需要执行一些初始化以使其进入可用状态.类似地,当不再需要bean并从容器中移除bean时,可能需要进行一些 ...
随机推荐
- SRC(不定期更新)
主域名收集 响应包 Content-Security-Policy-Report-Only
- RocketMQ 介绍与安装
目录 RocketMQ 介绍 MQ 介绍 MQ 作用 MQ 缺点 MQ 常见产品 RocketMQ 简介 RocketMQ 架构 RocketMQ 安装 RocketMQ 介绍 MQ 介绍 定义: M ...
- Android官方文档翻译 十七 4.1Starting an Activity
Starting an Activity 开启一个Activity This lesson teaches you to 这节课教给你 Understand the Lifecycle Callbac ...
- 【数据结构与算法】蓄水池抽样算法(Reservoir Sampling)
问题描述 给定一个数据流,数据流长度 N 很大,且 N 直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出 m 个不重复的数据. 比较直接的想法是利用随机数算 ...
- .NET下如何拦截鼠标、键盘消息?Win32NET来帮你
Win32NET是一个Win32API的.NET下封装的类库,包含: 1: 常用win32的API的net封装 2:鼠标.键盘.热键hook钩子模块, 3:模拟键盘输入文字(支持各种字符文字.不同语言 ...
- JavaScript中数字常用方法
数字常用方法 (1)返回0-1(不包含1)随机小数(random()) 格式:Math.random() var num=parseInt(Math.random()*11) //拿到0-10中的随机 ...
- Cesium中级教程4 - 空间数据可视化(二)
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Viewer中的Entity功能 让我们看看Viewer为操作e ...
- 搭服务器之kvm--vnc连接虚拟机连接闪退直接消失 以及virsh shutdown命令无效解决办法。
之前暑期见识到了虚拟化在企业中的应用,感慨不小,以前只是自己在玩儿桌面vmware workstation,安装的虚拟机也没啥大感觉.在公司机房里大家用的dell poweredge 420,8gme ...
- 使用 C# 开发 Kubernetes 组件,获取集群资源信息
写什么呢 前段时间使用 C# 写了个项目,使用 Kubernetes API Server,获取信息以及监控 Kubernetes 资源,然后结合 Neting 做 API 网关. 体验地址 http ...
- WEB前端基础之SCC(字体颜色背景-盒子模型)
目录 一:伪元素选择器 1.首字调整>>>:也是一种文档布局的方式 2.在文本的前面通过css动态渲染文本>>>:特殊文本无法选中 3.在文本的后面通过css动态渲 ...