【Spring篇】Spring的生命周期

一、Bean 生命周期的核心阶段

1. 实例化(Instantiation)

触发时机:容器启动时(单例 Bean)或请求时(原型 Bean)。
实现方式
通过反射(Class.newInstance() 或构造器)创建 Bean 的实例。

2. 属性赋值(Population)

依赖注入
通过字段注入(@Autowired)、Setter 注入或构造器注入为 Bean 的属性赋值。
处理 Aware 接口
若 Bean 实现了 BeanNameAwareBeanFactoryAware 等接口,容器会回调对应方法。

public class MyBean implements BeanNameAware {private String beanName;@Overridepublic void setBeanName(String name) {this.beanName = name; // 获取 Bean 的名称}
}
3. BeanPostProcessor 的前置处理

调用 postProcessBeforeInitialization
在 Bean 初始化前执行自定义逻辑(如修改 Bean 属性)。

public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {// 对 Bean 进行前置处理return bean;}
}
4. 初始化(Initialization)

@PostConstruct 注解方法
标记在方法上,容器会调用该方法。

@PostConstruct
public void init() {// 初始化逻辑
}

InitializingBean 接口
实现 afterPropertiesSet() 方法。

public class MyBean implements InitializingBean {@Overridepublic void afterPropertiesSet() {// 属性赋值完成后执行}
}

XML 配置的 init-method
在 XML 中指定初始化方法。

<bean id="myBean" class="com.example.MyBean" init-method="customInit"/>
5. BeanPostProcessor 的后置处理

调用 postProcessAfterInitialization
在 Bean 初始化后执行自定义逻辑(如生成代理对象)。

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {// 对 Bean 进行后置处理(如 AOP 代理)return bean;
}
6. Bean 就绪(In Use)

业务使用阶段
Bean 被应用程序代码调用,执行业务逻辑。

7. 销毁(Destruction)

@PreDestroy 注解方法
标记在方法上,容器销毁前调用。

@PreDestroy
public void cleanup() {// 释放资源逻辑
}

DisposableBean 接口
实现 destroy() 方法。

public class MyBean implements DisposableBean {@Overridepublic void destroy() {// 容器销毁时执行}
}

XML 配置的 destroy-method
在 XML 中指定销毁方法。

<bean id="myBean" class="com.example.MyBean" destroy-method="customDestroy"/>

二、生命周期的完整流程图

实例化 → 属性赋值 → BeanPostProcessor前置处理 → 初始化 → BeanPostProcessor后置处理 → 使用 → 销毁

三、扩展点与高级特性

1. Aware 接口

作用:让 Bean 感知容器环境。
常见接口
BeanNameAware:获取 Bean 的名称。
BeanFactoryAware:获取 BeanFactory 引用。
ApplicationContextAware:获取 ApplicationContext 引用。

2. BeanPostProcessor

核心用途
在 Bean 初始化前后插入自定义逻辑(如 AOP 代理、属性加密)。
典型场景
Spring AOP 通过 AbstractAutoProxyCreator(BeanPostProcessor 的子类)生成代理对象。

3. BeanFactoryPostProcessor

作用
在 Bean 定义加载后、实例化前修改 Bean 的定义(如修改属性值)。

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {BeanDefinition beanDef = beanFactory.getBeanDefinition("myBean");beanDef.getPropertyValues().add("property", "newValue");}
}
4. 作用域对生命周期的影响

单例(Singleton)
容器启动时创建,容器关闭时销毁。
原型(Prototype)
每次请求时创建,容器不管理其销毁。
其他作用域
Request/Session(Web 环境):生命周期与请求或会话绑定。
自定义作用域:通过 Scope 接口扩展。


四、示例代码:完整生命周期演示

1. Bean 类
public class LifecycleBean implements BeanNameAware, InitializingBean, DisposableBean {private String beanName;@Overridepublic void setBeanName(String name) {this.beanName = name; // BeanNameAware 回调}@PostConstructpublic void postConstruct() {System.out.println("@PostConstruct 方法调用");}@Overridepublic void afterPropertiesSet() {System.out.println("InitializingBean.afterPropertiesSet() 调用");}public void customInit() {System.out.println("XML init-method 调用");}@PreDestroypublic void preDestroy() {System.out.println("@PreDestroy 方法调用");}@Overridepublic void destroy() {System.out.println("DisposableBean.destroy() 调用");}public void customDestroy() {System.out.println("XML destroy-method 调用");}
}
2. BeanPostProcessor
public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {if (bean instanceof LifecycleBean) {System.out.println("BeanPostProcessor.postProcessBeforeInitialization() 调用");}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {if (bean instanceof LifecycleBean) {System.out.println("BeanPostProcessor.postProcessAfterInitialization() 调用");}return bean;}
}
3. 输出结果
实例化 LifecycleBean
BeanNameAware.setBeanName() 调用
BeanPostProcessor.postProcessBeforeInitialization() 调用
@PostConstruct 方法调用
InitializingBean.afterPropertiesSet() 调用
XML init-method 调用
BeanPostProcessor.postProcessAfterInitialization() 调用
...(Bean 使用阶段)...
@PreDestroy 方法调用
DisposableBean.destroy() 调用
XML destroy-method 调用

五、总结

  1. 核心阶段:实例化 → 属性注入 → 初始化 → 销毁。
  2. 关键扩展点
    • Aware 接口(获取容器信息)。
    BeanPostProcessor(初始化前后处理)。
    @PostConstruct/@PreDestroy(注解回调)。
    InitializingBean/DisposableBean(接口回调)。
  3. 作用域影响:单例和原型 Bean 的生命周期差异。
  4. 设计思想:通过回调接口和扩展点实现松耦合和可定制化。

通过掌握 Bean 的生命周期,可以更好地利用 Spring 的扩展能力(如自定义初始化、资源管理),同时避免因生命周期管理不当导致的资源泄漏或状态错误。

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

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

相关文章

Redis、Memcached应用场景对比

环境 Redis官方网站&#xff1a; Redis - The Real-time Data Platform Redis社区版本下载地址&#xff1a;Install Redis | Docs Memcached官方网站&#xff1a;memcached - a distributed memory object caching system Memcached下载地址&#xff1a;memcached - a dis…

kettle插件-mysql8数据库插件

场景&#xff1a;群里有小伙伴反馈kettle 7.x版本不能自动连接mysql8&#xff0c;安排&#xff01;&#xff01;&#xff01; 1、将mysql8的驱动包mysql-connector-java-8.0.20.jar丢到kettle的lib目录下&#xff0c;重启spoon。 2、配置数据库连接&#xff0c;提示驱动类不对…

【软件测试】:软件测试实战

1. ⾃动化实施步骤 1.1 编写web测试⽤例 1.2 ⾃动化测试脚本开发 common public class AutotestUtils {public static EdgeDriver driver;// 创建驱动对象public static EdgeDriver createDriver(){// 驱动对象已经创建好了 / 没有创建if( driver null){driver new EdgeDr…

深度学习入门1 基于Python的理论与实现

torch.unsqueeze()将一维数据变为二维数据&#xff0c;torch只能处理二维数据 tensor不能反向&#xff0c;variable可以反向。variable.data.numpy()转换为numpy 第3章 神经网络 实现softmax函数时的注意事项&#xff1a;为防止e的指数运算造成溢出 矩阵的第 0 维是列方向,第…

解决 Pentaho Kettle 插件集成中的 NoSuchMethodError: ContextFactory.enterContext() 错误

解决 Pentaho Kettle 插件集成中的 NoSuchMethodError: ContextFactory.enterContext() 错误 在使用 Pentaho Data Integration&#xff08;也称为 Kettle&#xff09;进行数据集成和ETL开发时&#xff0c;开发者可能会遇到各种依赖冲突和技术挑战。本文将详细介绍一个常见的错…

第 五 章:优化算法_《C++性能优化指南》_notes

优化算法 第五章重难点详解与代码实战编译与测试说明第五章核心知识点整理重难点梳理 第一部分&#xff1a;多选题&#xff08;10道&#xff09;第二部分&#xff1a;设计题&#xff08;5道&#xff09;答案与详解多选题答案&#xff1a; 设计题参考实现&#xff08;以题目2为例…

多版本PHP开发环境配置教程:WAMPServer下MySQL/Apache/MariaDB版本安装与切换

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、版本切换指南总结 前言 由于有几个项目分别使用到PHP7.0 和7.4以及8.0版本&#xff0c;设置mysql也会根据PHP版本使用不同的版本&#xff0c;于是开始研究…

2024年数维杯数学建模C题天然气水合物资源量评价解题全过程论文及程序

2024年数维杯数学建模 C题 天然气水合物资源量评价 原题再现&#xff1a; 天然气水合物&#xff08;Natural Gas Hydrate/Gas Hydrate&#xff09;即可燃冰&#xff0c;是天然气与水在高压低温条件下形成的类冰状结晶物质&#xff0c;因其外观像冰&#xff0c;遇火即燃&#…

阶段一:Java基础语法

目标&#xff1a;掌握Java的基本语法&#xff0c;理解变量、数据类型、运算符、控制结构等。 1. Java开发环境搭建 安装JDK配置环境变量编写第一个Java程序 代码示例&#xff1a; // HelloWorld.java public class HelloWorld { // 定义类名为 HelloWorldpublic static vo…

从0到1,解锁Ant Design X的无限可能

Ant Design X 是什么&#xff1f; 在人工智能飞速发展的当下&#xff0c;AI 驱动的界面已成为软件开发的重要趋势。而 Ant Design X 正是顺应这一趋势&#xff0c;于 2024 年应运而生的一款遵循 Ant Design 设计体系的 React UI 库&#xff0c;它旨在帮助开发者轻松打造 AI 驱…

Graphpad Prism for Mac医学绘图

Graphpad Prism for Mac医学绘图 文章目录 Graphpad Prism for Mac医学绘图一、介绍二、效果三、下载 一、介绍 GraphPad Prism for Mac是一款功能强大、易于使用的科学和统计分析软件&#xff0c;适用于各种类型的数据处理和可视化需求。无论您是进行基础研究、临床试验还是学…

mysqloracledb2 (uuid函数)

项目场景&#xff1a; 创建一个32位的UUID 问题描述 原因分析&#xff1a; 解决方案&#xff1a; mysql内置UUID函数 SELECT UUID(); SELECT UUID_SHORT();oracle内置UUID函数 SELECT sys_guid() FROM dual;db2&#xff0c;模拟UUID函数 SELECT TEST || substr (CONCAT…

Android实践开发制作小猴子摘桃小游戏

Android实践制作小猴子摘桃小游戏 实践素材项目源文件获取&#xff1a;Android可能存在版本差异项目如果不能正确运行&#xff0c;可以使用里面的素材自己构建项目Android实践制作小猴子摘桃小游戏Android实践制作小猴子摘桃小游戏https://mp.weixin.qq.com/s/jNU_hVfj9xklsil…

Postman 下载文件指南:如何请求 Excel/PDF 文件?

在 Postman 中进行 Excel/PDF 文件的请求下载和导出&#xff0c;以下是简明的步骤&#xff0c;帮助你轻松完成任务。首先&#xff0c;我们将从新建接口开始&#xff0c;逐步引导你完成整个过程。 Postman 请求下载/导出 excel/pdf 文件教程

重要重要!!fisher矩阵是怎么计算和更新的,以及计算过程中参数的物理含义

fisher矩阵是怎么计算和更新的,以及计算过程中参数的物理含义 Fisher信息矩阵(Fisher Information Matrix, FIM)用于衡量模型参数估计的不确定性,其计算和更新在统计学、机器学习和优化中具有重要作用。以下是其计算和更新的关键步骤: 一、Fisher矩阵的计算 定义 Fisher…

21.Excel自动化:如何使用 xlwings 进行编程

一 将Excel用作数据查看器 使用 xlwings 中的 view 函数。 1.导包 import datetime as dt import xlwings as xw import pandas as pd import numpy as np 2.view 函数 创建一个基于伪随机数的DataFrame&#xff0c;它有足够多的行&#xff0c;使得只有首尾几行会被显示。 df …

Elasticsearch客户端工具初探--kibana

1 Kibana简介 Kibana是Elastic Stack&#xff08;ELK&#xff09;中的可视化工具&#xff0c;用于对Elasticsearch中存储的数据进行搜索、分析和可视化展示。它提供了直观的Web界面&#xff0c;支持日志分析、业务监控、数据探索等功能&#xff0c;广泛应用于运维监控、安全分析…

珍珠港海军造船厂的“水魔法”:PcVue赋能造船心脏

导读 项目背景 干船坞运作与控制需求 PcVue SCADA 系统的引入以及系统升级 项目成果 凭借更高的安全性&#xff0c;PcVue 对干船坞的充水和排水过程进行精准控制。 项目背景 珍珠港海军基地与希卡姆空军基地均依托这座历史悠久的港口而发展&#xff0c;该港口在夏威夷原住…

3. 轴指令(omron 机器自动化控制器)——>MC_GearInPos

机器自动化控制器——第三章 轴指令 17 MC_GearInPos变量▶输入变量▶输出变量▶输入输出变量 功能说明▶时序图▶重启运动指令▶多重启动运动指令▶异常 示例程序▶动作示例▶梯形图▶结构文本(ST) MC_GearInPos 设定主轴和从轴间的齿轮比&#xff0c;进行电子齿轮动作。 指定…

vue 加载动态效果,自行封装组件

背景&#xff1a; 在项目开发中&#xff0c;会请求接口&#xff0c;就会遇到加载中、加载成功、加载失败、和加载成功但暂无数据等情况。就自行封装了一个加载组件。采用vue3elementsetup组合式写法。 实现效果&#xff1a; 封装组件&#xff1a; //封装组件 <template>…