【Spring Framework 源码阅读与笔记】Bean 的生命周期管理

Spring Framework 源码阅读与笔记

题目:Bean 的生命周期管理

  • 阅读 Spring 框架中 Bean 生命周期管理的相关源码,如 AbstractBeanFactoryBeanPostProcessor 等。
  • 分析 Bean 从创建到销毁的各个阶段,以及如何通过 BeanPostProcessor 进行拦截和处理。

笔记

1 核心类与方法介绍
1.1 AbstractBeanFactory

AbstractBeanFactory 是 Spring BeanFactory 的核心抽象类,负责管理 Bean 的整个生命周期。它将 Bean 的创建、初始化、依赖注入、销毁等操作抽象出来。

关键方法:

  • getBean():用于获取 Bean,先检查缓存,避免重复创建。
  • doGetBean():实现主要的创建和初始化逻辑。
  • createBean():执行 Bean 的实例化、依赖注入和初始化。
  • initializeBean():初始化过程中调用 BeanPostProcessorpostProcessBeforeInitializationpostProcessAfterInitialization 方法,并执行初始化方法。
1.2 BeanPostProcessor 接口

BeanPostProcessor 是 Spring 中的扩展接口,用于在 Bean 初始化前后进行自定义处理。

关键方法:

  • postProcessBeforeInitialization():初始化前对 Bean 进行处理。
  • postProcessAfterInitialization():初始化后对 Bean 进行处理(如代理增强)。

BeanPostProcessor 使得 Bean 的创建过程可插拔,常用于实现 AOP。


2 Bean 生命周期的主要阶段
2.1 实例化(Instantiation)

通过 createBeanInstance() 方法创建 Bean,使用反射调用构造器。

2.2 属性填充(Dependency Injection)

通过 populateBean() 进行依赖注入,设置 Bean 的依赖属性。

2.3 初始化前处理(Pre-Initialization)

在初始化前,Spring 调用 postProcessBeforeInitialization() 方法进行预处理。

2.4 初始化(Initialization)

调用 Bean 的初始化方法。若 Bean 实现了 InitializingBean 接口或配置了初始化方法,则执行相关方法。

2.5 初始化后处理(Post-Initialization)

初始化后,Spring 调用 postProcessAfterInitialization() 方法进行后处理。

2.6 销毁(Destruction)

容器关闭时,Spring 调用销毁方法,如 DisposableBean 接口的 destroy() 或自定义销毁方法。


3 源码结构分析
3.1 AbstractBeanFactory

负责 Bean 的创建、初始化、依赖注入和销毁等操作。

关键逻辑:

  • getBean():检查缓存,缓存未命中时调用 doGetBean() 创建 Bean。
  • doGetBean():完成 Bean 的创建与初始化。
  • createBean():通过反射创建 Bean,进行依赖注入和初始化。
  • initializeBean():调用 BeanPostProcessor 方法并执行初始化方法。
3.2 BeanPostProcessor 接口

提供了对 Bean 初始化前后的处理能力。

关键逻辑:

  • postProcessBeforeInitialization():初始化前的处理逻辑。
  • postProcessAfterInitialization():初始化后的处理逻辑(如增强)。
3.3 getBean() 方法分析

通过调试 getBean(),可以看到缓存检查过程和 doGetBean() 中的创建与初始化过程。

调试点:

  • 缓存检查:检查缓存是否已有 Bean。
  • doGetBean():未命中缓存时,进入 Bean 创建流程。
3.4 createBean() 方法分析

createBean() 负责实际的实例化、依赖注入和初始化过程。

调试点:

  • 实例化:通过反射创建 Bean。
  • 依赖注入:执行 populateBean(),填充 Bean 的依赖。
  • 初始化:调用 initializeBean(),执行初始化逻辑。
3.5 BeanPostProcessor 的处理

BeanPostProcessor 允许在 Bean 初始化前后插入自定义处理逻辑。

调试点:

  • 初始化前:查看 postProcessBeforeInitialization() 方法的处理过程。
  • 初始化后:分析 postProcessAfterInitialization() 方法的处理过程。

4 知识点总结
  1. Bean 生命周期管理:Spring 通过 AbstractBeanFactory 管理 Bean 从创建到销毁的完整生命周期。
  2. BeanPostProcessor 拦截机制:允许在 Bean 初始化前后执行自定义逻辑,是 AOP 的基础。
  3. 初始化方法调用:支持自动识别 InitializingBean 接口和自定义初始化方法,确保 Bean 正确初始化。
  4. 销毁方法调用:支持通过 DisposableBean 和自定义方法进行销毁处理,释放资源。

5 设计模式总结
5.1 代理模式(Proxy Pattern)
  • 应用场景BeanPostProcessor 实现了代理模式,允许在 Bean 初始化前后加入自定义处理(如 AOP 增强)。
  • 优势:将增强逻辑与业务逻辑分离,实现无侵入式的 Bean 增强。
5.2 工厂模式(Factory Pattern)
  • 应用场景AbstractBeanFactory 负责创建和管理不同类型的 Bean 实例。
  • 优势:封装 Bean 创建逻辑,提升代码可读性和可扩展性。
5.3 模板方法模式(Template Method Pattern)
  • 应用场景AbstractBeanFactory 提供了 Bean 生命周期管理的基本流程,具体逻辑由子类实现。
  • 优势:提取通用逻辑,子类可灵活扩展,保证框架的可扩展性和可维护性。

本文作者:鸿·蒙

文档工具:Typora

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 鸿·蒙 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/475736.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据挖掘期末复习

大数据挖掘 数据挖掘 数据挖掘定义 技术层面: 数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,提取隐含在其中、人们事先不知道的、但又潜在有用的信息的过程。 数据准备环节 数据选择 质量分析 数据预处理 数据仓库 …

【Anomaly Detection论文阅读记录】Resnet网络与WideResNet网络

Resnet网络 网络结构:(层数计算不包括max pool、average pool、softmax等操作) 层数计算(以Resnet-18为例子): conv1conv2_xconv3_xconv4_xconv5_xfc1(22)(22)(22)(22)118 WideResNet网络 WideResNet提出了一种新的体系结构&#…

基于YOLOv8深度学习的汽车车身车损检测系统研究与实现(PyQt5界面+数据集+训练代码)

本文研究并实现了一种基于YOLOV8深度学习模型的汽车车身车损检测系统,旨在解决传统车损检测中效率低、精度不高的问题。该系统利用YOLOV8的目标检测能力,在单张图像上实现了车身损坏区域的精确识别和分类,尤其是在车身凹痕、车身裂纹和车身划…

【前端学习笔记】Javascript学习二(运算符、数组、函数)

一、运算符 运算符(operator)也被称为操作符,是用于实现赋值、比较和执行算数运算等功能的符号。 JavaScript中常用的运算符有: 算数运算符、递增和递减运算符、比较运算符、逻辑运算符、赋值运算符 算数运算符: 、-…

python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具

python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具 文章目录 python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具项目背景技术栈用户界面核心功能实现结果展示完整代码总结 在现代软件开发中,测试接口的有效性与响应情况变得尤为重要。本文将指导…

网络安全之信息收集-实战-1

请注意,本文仅供合法和授权的渗透测试使用,任何未经授权的活动都是违法的。 实战:补天公益src“吉林通用航空职业技术学院” 奇安信|用户登录https://www.butian.net/Loo/submit?cid64918 域名或ip:https://www.jlth…

鸿蒙实战:使用隐式Want启动Ability

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙应用项目2.2 修改Index.ets代码2.3 创建LuzhouAbility2.4 创建Luzhou页面2.5 设置模块配置文件 3. 测试效果4. 实战总结 1. 实战概述 本次鸿蒙应用实战,先创建项目“ImplicitWantStartAbility”,接着修改In…

STM32低功耗设计NFC与无线距离感应智能钥匙扣-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 智能钥匙扣作为一种小巧而实用的智能设备,凭借其便携性…

【Node.js】Node.js 和浏览器之间的差异

Node.js 是一个强大的运行时环境,它在现代 JavaScript 开发中扮演着重要角色。然而,许多开发者在使用 Node.js 时常常会感到困惑,尤其是与浏览器环境的对比。本文将深入探讨 Node.js 和浏览器之间的差异,帮助你全面理解两者的设计…

qt之telnet连接目标设备在线调试功能

一、前言 在QT下使用telnet连接目标设备,进行在线命令调试,也可配合ftp或ssh使用。 telnet某些库在qt5下不可用,无法获取登录信息,只能获取到连接信息,这里我用自己的方式判断是否成功登录 二、环境 window qt5.7…

小熊派Nano接入华为云

一、华为云IoTDA创建产品 创建如下服务,并添加对应的属性和命令。 二、小熊派接入 根据小熊派官方示例代码D6完成了小熊派接入华为云并实现属性上传命令下发。源码:小熊派开源社区/BearPi-HM_Nano 1. MQTT连接代码分析 这部分代码在oc_mqtt.c和oc_mq…

Hbuilder X/Uniapp 关于app运行调试及mumu模拟器运行问题

Hbuilder X 关于app调试问题及mumu模拟器链接问题 Hbuilder 关于app调试问题1. app运行配置2. adb路径配置3. 模拟器端口查询4. 运行 Hbuilder 关于app调试问题 1. app运行配置 Hbuilder > 工具 > 设置 > 运行配置 adb路径配置(见2) Android模…

MySQL-关键字执行顺序

&#x1f496;简介 在MySQL中&#xff0c;SQL查询语句的执行遵循一定的逻辑顺序&#xff0c;即使这些关键字在SQL语句中的物理排列可能有所不同。 &#x1f31f;语句顺序 (8) SELECT (9) DISTINCT<select_list> (1) FROM <left_table> (3) <join_type> JO…

【SpringBoot】26 实体映射工具(MapStruct)

Gitee 仓库 https://gitee.com/Lin_DH/system 介绍 现状 为了让应用程序的代码更易于维护&#xff0c;通常会将项目进行分层。在《阿里巴巴 Java 开发手册》中&#xff0c;推荐分层如下图所示&#xff1a; 每层都有对应的领域模型&#xff0c;即不同类型的 Bean。 DO&…

RPC-健康检测机制

什么是健康检测&#xff1f; 在真实环境中服务提供方是以一个集群的方式提供服务&#xff0c;这对于服务调用方来说&#xff0c;就是一个接口会有多个服务提供方同时提供服务&#xff0c;调用方在每次发起请求的时候都可以拿到一个可用的连接。 健康检测&#xff0c;能帮助从连…

Enterprise Architect 16 下载、安装与无限30天操作

文章目录 Enterprise Architect 16 简介&#xff08;一&#xff09;支持多种建模语言和标准&#xff08;二&#xff09;强大的版本控制、协作和文档管理功能&#xff08;三&#xff09;增强的技术和用户体验&#xff08;四&#xff09;高级功能和扩展性 一&#xff0c;下载软件…

小程序租赁系统开发为企业提供高效便捷的租赁服务解决方案

内容概要 在这个数字化飞速发展的时代&#xff0c;小程序租赁系统应运而生&#xff0c;成为企业管理租赁业务的一种新选择。随着移动互联网的普及&#xff0c;越来越多的企业开始关注如何利用小程序来提高租赁服务的效率和便捷性。小程序不仅可以为用户提供一个快速、易用的平…

定时器的小应用

第一个项目 第一步&#xff0c;RCC开启时钟&#xff0c;这个基本上每个代码都是第一步&#xff0c;不用多想&#xff0c;在这里打开时钟后&#xff0c;定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…

JVM--内存结构

目录 1. PC Register&#xff08;程序计数器&#xff09; 1.1 定义 1.2 工作原理 1.3 特点 1.4 应用 2.虚拟机栈 2.1定义与特性 2.2内存模型 2.3工作原理 2.4异常处理 2.5应用场景 2.6 Slot 复用 2.7 动态链接详解 1. 栈帧与动态链接 动态链接的作用&#xff1a…

一文读懂Redis6的--bigkeys选项源码以及redis-bigkey-online项目介绍

一文读懂Redis6的--bigkeys选项源码以及redis-bigkey-online项目介绍 本文分为两个部分&#xff0c;第一是详细讲解Redis6的--bigkeys选项相关源码是怎样实现的&#xff0c;第二部分为自己对--bigkeys源码的优化项目redis-bigkey-online的介绍。redis-bigkey-online是自己开发的…