任何对象都有生命周期,那么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生命周期关键触发时机的更多相关文章

  1. spring(二、bean生命周期、用到的设计模式、常用注解)

    spring(二.bean生命周期.用到的设计模式.常用注解) Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的. ...

  2. 金三银四,还在为spring源码发愁吗?bean生命周期,看了这篇就够了

    第一,这绝对是一个面试高频题. 比第一还重要的第二,这绝对是一个让人爱恨交加的面试题.为什么这么说?我觉得可以从三个方面来说: 先说会不会.看过源码的人,这个不难:没看过源码的人,无论是学.硬背.还是 ...

  3. Spring事务,Bean生命周期

    一.事务相关: 1.Spring事务基于Spring AOP切面编程: 2.AOP基于代理模式,得到需要开启事务的代码的代理对象: 3.而没有开启事务的Service方法里调用了开启事务 @Trans ...

  4. SpringBoot IoC启动流程、初始化过程及Bean生命周期各个阶段的作用

    目录 SpringBoot IoC启动流程.初始化过程及Bean生命周期各个阶段的作用 简述 首先明确IoC容器是啥 准备-SpringApplication的实例化 启动-SpringApplica ...

  5. Spring源码系列 — Bean生命周期

    前言 上篇文章中介绍了Spring容器的扩展点,这个是在Bean的创建过程之前执行的逻辑.承接扩展点之后,就是Spring容器的另一个核心:Bean的生命周期过程.这个生命周期过程大致经历了一下的几个 ...

  6. 手写Spring框架,是时候撸个AOP与Bean生命周期融合了!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 嘎小子,这片代码水太深你把握不住! 在电视剧<楚汉传奇>中有这么一段刘邦 ...

  7. Spring Bean 生命周期2

    在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Sin ...

  8. Spring bean 生命周期验证

    一.从源码注释看bean生命周期 从JDK源码上看,BeanFactory实现类需要支持Bean的完整生命周期,完整的初始化方法及其标准顺序(格式:接口 方法)为: 1.BeanNameAware s ...

  9. Spring(四)之Bean生命周期、BeanPost处理

    一.Bean 生命周期 Spring bean的生命周期很容易理解.当bean被实例化时,可能需要执行一些初始化以使其进入可用状态.类似地,当不再需要bean并从容器中移除bean时,可能需要进行一些 ...

随机推荐

  1. day 14 C语言strcmp()函数:比较两个字符串

    (1).下列关于C语言文件的叙述中正确的是[C] (A).文件由一系列数据依次排列组成,只能构成二进制文件 (B).文件由结结构序列组成,可以构成二进制文件或文本文件 (C).文件由数据序列组成,可以 ...

  2. elasticsearch拼写纠错之Term Suggester

    一.什么是拼写纠错 拼写纠错就是搜索引擎可以智能的感知用户输入关键字的错误,并使用纠正过的关键字进行搜索展示给用户:拼写纠错是一种改善用户体验的功能: elasticsearch提供了以下不同类型的s ...

  3. 《剑指offer》面试题53 - I. 在排序数组中查找数字 I

    问题描述 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8, ...

  4. 【刷题-LeetCode】221. Maximal Square

    Maximal Square Given a 2D binary matrix filled with 0's and 1's, find the largest square containing ...

  5. jmeter - 阶梯式性能指标监听

    概述 我们在进行阶梯式压力测试的时候,聚合报告生成的结果是一个汇总数据.并不会阶梯式的统计压测性能数据.这样我们就不能去对比不同阶梯压力下的性能数据变化趋势. 期望 假设现在一共会加载100个线程,我 ...

  6. C++模板之成员模板和模板构造函数

    namespace myspace6 { template<typename T1> class TC { public: template<typename T2> TC(T ...

  7. AOP-操作术语

    AOP(术语) 1,连接点 类里面哪些方法可以被增强,这些方法称为连接点 2,切入点 实际被真正增强的方法,称为切入点 3,通知(增强) (1)实际增强的逻辑部分称为通知(增强) (2)通知有多种类型 ...

  8. 理解cpu load

    三种命令 1. w 2. uptime 3. top CPU负载和CPU利用率的区别 1)CPU利用率:显示的是程序在运行期间实时占用的CPU百分比 2)CPU负载:显示的是一段时间内正在使用和等待使 ...

  9. 带你十天轻松搞定 Go 微服务系列(六)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务(本文) RPC 服务 Auth ...

  10. 线程终止的四种方式,interrupt 方法使用的简单介绍。

    一 正常结束. package com.aaa.threaddemo; /* 一 终止线程的四种方式? * 程序运行结束,线程终止. * */ public class ThreadTerminati ...