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时,可能需要进行一些 ...
随机推荐
- 使用.NET 6开发TodoList应用(24)——实现基于JWT的Identity功能
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在.NET Web API开发中还有一个很重要的需求是关于身份认证和授权的,这个主题非常大,所以本文不打算面面俱到地介绍整个主 ...
- 蓝桥杯ALGO-1003
问题描述 JiaoShou在爱琳大陆的旅行完毕,即将回家,为了纪念这次旅行,他决定带回一些礼物给好朋友. 在走出了怪物森林以后,JiaoShou看到了排成一排的N个石子. 这些石子很漂亮,JiaoSh ...
- 在 python 项目中如何记录日志
一. 概述 写本文的目的是我在写 python 项目的时候需要记录日志,我忘记怎么处理了,每次都需要去网上查一遍,好记性不如烂笔头, 这里把查阅的内容记录下来,方便以后查找. python 项目中记录 ...
- Sentry 开发者贡献指南 - 配置 PyCharm
概述 如果您使用 PyCharm 进行开发,则需要配置一些内容才能运行和调试. 本文档描述了一些对 sentry 开发有用的配置 配置 Python 解释器:(确保它是 venv 解释器)例如 ~/v ...
- porcupine语音唤醒python实现
note it is not for arm pyaudio <= 3.6 version porcupine 3.5 3.6 not 3.7 code import struct import ...
- Docker安装配置mysql
Docker安装mysql踩坑日记 拉取镜像 sudo docker pull mysql:5.7 运行镜像 docker run -p 3306:3306 --name mysql -v /myda ...
- LSM树以及在hbase中的应用
转自:http://www.cnblogs.com/yanghuahui/p/3483754.html 讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来: 哈希存储引擎 是哈希 ...
- linux系统别名
目录 一:系统别名 一:系统别名 alias 格式: alias xxx='命令' alias : 查看系统别名 alias rm='xxx' : 设置系统别名 改别名 别名 执行这个命令 [root ...
- Nginx怎么处理请求的?
nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的 location,location就是实际地址. server { # 第 ...
- shell循环ping ip的写法
#!/bin/bash for i in `seq 1 20` do if ping -w 2 -c 1 192.168.43.$i | grep "100%" > /dev ...