当前位置: 首页 > news >正文

Spring Bean 的生命周期介绍

Spring Bean 的生命周期涉及多个阶段,从实例化到销毁,在开发中我们可以通过各种接口和注解介入这些阶段来定制化自己的功能。以下是详细的生命周期流程:


1. Bean 的实例化(Instantiation)

  • 方式:通过构造函数或工厂方法创建 Bean 的实例。
  • 触发条件:容器启动时,根据配置(如 @Component、XML 配置等)创建 Bean。
  • 关键点:此时 Bean 的属性尚未注入。

2. 属性赋值(Population of Properties)

  • 依赖注入:通过 @Autowired、Setter 方法、XML 配置的 <property> 等方式注入依赖。
  • 处理 @Value:解析并注入外部化配置(如 application.properties)。

3. Aware 接口回调

Bean 可以通过实现 Aware 接口获取容器信息:

  • BeanNameAware:获取 Bean 的名称。
  • BeanFactoryAware:获取 BeanFactory 实例。
  • ApplicationContextAware:获取 ApplicationContext 实例。
  • EnvironmentAware:获取环境变量和配置。
public class MyBean implements BeanNameAware {@Overridepublic void setBeanName(String name) {// 获取 Bean 的名称}
}

4. BeanPostProcessor 的前置处理

  • 接口BeanPostProcessor.postProcessBeforeInitialization()
  • 作用:在初始化方法(如 @PostConstruct)之前执行自定义逻辑。
  • 典型应用:AOP 代理的生成、监控埋点等。

5. 初始化(Initialization)

初始化逻辑按顺序执行:

  1. @PostConstruct 注解:JSR-250 标准,标记初始化方法。
  2. InitializingBean.afterPropertiesSet():Spring 提供的初始化接口。
  3. 自定义 init-method:通过 XML 或 @Bean(initMethod = "init") 指定。
public class MyBean {@PostConstructpublic void postConstruct() {// 初始化逻辑}public void init() {// XML 或 @Bean 指定的初始化方法}
}

6. BeanPostProcessor 的后置处理

  • 接口BeanPostProcessor.postProcessAfterInitialization()
  • 作用:在初始化方法之后执行自定义逻辑。
  • 典型应用:最终代理对象的包装(如 Spring AOP)。

7. Bean 就绪(Ready)

  • 此时 Bean 已完全初始化,可被应用程序使用。
  • 作用域影响
    • Singleton:容器中只有一个实例。
    • Prototype:每次请求都生成新实例(销毁需手动处理)。
    • 其他作用域(Request、Session 等):生命周期与会话或请求绑定。

8. 销毁(Destruction)

销毁逻辑按顺序执行:

  1. @PreDestroy 注解:JSR-250 标准,标记销毁方法。
  2. DisposableBean.destroy():Spring 提供的销毁接口。
  3. 自定义 destroy-method:通过 XML 或 @Bean(destroyMethod = "destroy") 指定。
public class MyBean {@PreDestroypublic void preDestroy() {// 销毁逻辑}public void destroy() {// XML 或 @Bean 指定的销毁方法}
}

完整生命周期流程图

实例化 → 属性注入 → Aware 接口 → BeanPostProcessor 前置处理 → 
@PostConstruct → InitializingBean → init-method → 
BeanPostProcessor 后置处理 → 使用中 → 
@PreDestroy → DisposableBean → destroy-method

扩展点与注意事项

  1. BeanFactoryPostProcessor
    • 在 Bean 定义加载后、实例化前修改 Bean 的定义(如修改属性值)。
  2. BeanDefinitionRegistryPostProcessor
    • 更早阶段注册额外的 Bean 定义。
  3. 作用域差异
    • Prototype Bean 的销毁需手动调用 ctx.getBeanFactory().destroyBean(bean)
  4. 循环依赖
    • 通过三级缓存解决(仅限 Singleton Bean)。

示例代码

public class LifecycleBean implements BeanNameAware, InitializingBean, DisposableBean {private String name;@Overridepublic void setBeanName(String name) {this.name = name; // BeanNameAware 回调}@PostConstructpublic void postConstruct() {System.out.println("@PostConstruct 方法");}@Overridepublic void afterPropertiesSet() {System.out.println("InitializingBean.afterPropertiesSet()");}public void customInit() {System.out.println("自定义 init-method");}@PreDestroypublic void preDestroy() {System.out.println("@PreDestroy 方法");}@Overridepublic void destroy() {System.out.println("DisposableBean.destroy()");}public void customDestroy() {System.out.println("自定义 destroy-method");}
}

通过理解 Spring Bean 的生命周期,我们可以更精准地控制 Bean 的初始化与销毁过程,优化资源管理和扩展框架功能。

相关文章:

Spring Bean 的生命周期介绍

Spring Bean 的生命周期涉及多个阶段&#xff0c;从实例化到销毁&#xff0c;在开发中我们可以通过各种接口和注解介入这些阶段来定制化自己的功能。以下是详细的生命周期流程&#xff1a; 1. Bean 的实例化&#xff08;Instantiation&#xff09; 方式&#xff1a;通过构造函…...

奥卡姆剃刀原理:用简单的力量,解锁复杂的世界

奥卡姆剃刀原理 大名鼎鼎的奥卡姆剃刀原理&#xff08;Occam’s Razor&#xff09;&#xff0c;其含义很简单&#xff0c;就一句话&#xff1a;“如无必要&#xff0c;勿增实体”。 这句看似简单却蕴含着深刻智慧的话&#xff0c;是由14世纪的英格兰逻辑学家、圣方济各会修士…...

STM32 串口发送与接收

接线图 代码配置 根据上一章发送的代码配置&#xff0c;在GPIO配置的基础上需要再配置PA10引脚做RX接收&#xff0c;引脚模式可以选择浮空输入或者上拉输入&#xff0c;在USART配置串口模式里加上RX模式。 配置中断 //配置中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE…...

如何生成强密码:提高网络安全性的全面指南

引言 在数字化时代&#xff0c;密码的安全性至关重要。随着我们在社交媒体、电子邮件、在线银行等平台上储存越来越多的个人信息&#xff0c;强密码的使用变得更加关键。强密码能有效防止暴力破解、字典攻击等安全威胁。因此&#xff0c;在本文中&#xff0c;我们将深入探讨如…...

如何不更新application.yml而更新spring的配置

更改应用程序外部属性的位置 默认情况下&#xff0c;来自不同来源的属性会按定义的顺序添加到 Spring 中&#xff08;有关确切顺序&#xff0c;请参阅“Spring Boot 功能”部分中的“外部化配置”&#xff09;。Environment 您还可以提供以下系统属性&#xff08;或环境变量&…...

【Unity踩坑】Unity项目管理员权限问题(Unity is running as administrator )

问题描述&#xff1a; 使用Unity Hub打开或新建项目时会有下面的提示。 解决方法&#xff1a; 打开“本地安全策略”&#xff1a; 在Windows搜索栏中输入secpol.msc并回车&#xff0c;或者从“运行”对话框&#xff08;Win R&#xff0c;然后输入secpol.msc&#xff09;启…...

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter1-什么是 JavaScript

一、什么是 JavaScript 虽然 JavaScript 和 ECMAScript&#xff08;发音为“ek-ma-script”&#xff09; 基本上是同义词&#xff0c;但 JavaScript 远远不限于 ECMA-262 所定义的那样。没错&#xff0c;完整的 JavaScript 实现包含以下几个部分。 核心&#xff08;ECMAScript&…...

队列 + 宽搜(4题)

目录 1.n叉树的层序遍历 2.二叉树的锯齿形层序遍历 3.二叉树的最大宽度 4.在每个树行中找最大值 1.n叉树的层序遍历 429. N 叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 我们只需要把某个节点出队的时候把它的孩子节点添加进来即可。 出队的次数就是最开始队列…...

二、面向对象

一、结构体类型 结构体类型是一种自定义类型&#xff0c;用于创建我们游戏或者实际业务中的自定义类型. 代码中变量有通用的&#xff0c;可以使用结构体&#xff0c;包裹起来。 1、成员变量 /// <summary> /// 英雄结构体 /// </summary> struct Hero {//成员p…...

【DeepSeek背后的技术】系列二:大模型知识蒸馏(Knowledge Distillation)

目录 1 引言2 操作步骤和公式说明2.1 准备教师模型&#xff08;Teacher Model&#xff09;和学生模型&#xff08;Student Model&#xff09;2.2 生成软标签&#xff08;Soft Labels&#xff09;2.3 定义蒸馏损失函数2.4 训练学生模型2.5 调整超参数2.6 评估与部署 3 其他知识蒸…...

PyQt4学习笔记2】QMainWindow

目录 一、创建 QMainWindow 组件 1. 创建工具栏 2. 创建停靠窗口 3. 设置状态栏 4. 设置中央窗口部件 二、QMainWindow 的主要方法 1. addToolBar() 2. addDockWidget() 3. setStatusBar() 4. setCentralWidget() 5. menuBar() 6. saveState() 和 restoreState() 三、QMainWind…...

《海丰县蔡氏简介》前言

《海丰县蔡氏简介》前言 蔡惠进主编 汕尾市海陆丰蔡姓祖先基本是福建人&#xff0c; 在宋朝时迁至海丰&#xff0c; 因受潮汕文化、 客家文化、 广府文化、 政治归属等系列因素影响&#xff0c; 形成了闽南人一 种新的文化&#xff0c; 既有传统的闽南文化&#xff0c; 又有潮汕…...

深入探索Vue 3组合式API

深入探索Vue 3组合式API 深入探索Vue 3组合式API一、组合式API诞生背景1.1 Options API的局限性1.2 设计目标二、核心概念解析2.1 setup() 函数&#xff1a;组合式API的基石2.2 响应式系统&#xff1a;重新定义数据驱动2.3 生命周期&#xff1a;全新的接入方式2.4 响应式原理探…...

获取 ARM Cortex - M 系列处理器中 PRIMASK 寄存器的值

第一种实现&#xff08;纯汇编形式&#xff09; __ASM uint32_t __get_PRIMASK(void) {mrs r0, primaskbx lr }代码分析 __ASM 关键字&#xff1a;这通常是特定编译器&#xff08;如 ARM GCC 等&#xff09;用于嵌入汇编代码的指示符。它告诉编译器下面的代码是汇编代码。mrs …...

使用deepseek写一个单击,双击和长按的检测函数

DeepSeek好火&#xff0c;注册试用一下&#xff0c;感觉和chatgpt o1差别不大&#xff0c;唯一的问题就是追多几次就崩溃了&#xff0c;再问不下去了。以下是测试结果。 提问&#xff1a; 请使用c语言写一个函数&#xff0c;输入参数是是为&#xff1a; A为当前的输入量&am…...

MySQL面经

1.范式 第一范式&#xff1a;每一列都不能再拆分 第二范式&#xff1a;在第一范式的基础上&#xff0c;非主键列完全依赖于主键&#xff0c;而不是主键的一部分 第三范式&#xff1a;在第二范式的基础上&#xff0c;非主键列只依赖于主键列&#xff0c;而不依赖于其他非主键…...

【C++】P1765 手机

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;问题描述题目内容示例&#xff1a; 键盘布局 &#x1f4af;我的做法思路问题与优化我的代码实现分析与问题 &#x1f4af;老师的做法思路老师的代码实现分析优点 &#x1f…...

MyBatis-Plus速成指南:简化你的数据库操作流程

简介&#xff1a; MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。MyBatsi-Plus 提供了通用的 Mapper 和 Service&#xff0c;可以不编写任何 SQL 语句的前提下&#xff0c;快速的实现单表的增…...

DeepSeek超越ChatGPT的能力及部分核心原理

DeepSeek超越ChatGPT的能力及部分核心原理 目录 DeepSeek超越ChatGPT的能力及部分核心原理超越ChatGPT的能力核心原理超越ChatGPT的能力 推理计算能力更强:在复杂的数学计算、法律文件审查等任务中,DeepSeek的推理能力可媲美甚至超越部分国际顶尖AI模型,包括ChatGPT。例如在…...

优选算法的灵动之章:双指针专题(一)

个人主页&#xff1a;手握风云 专栏&#xff1a;算法 目录 一、双指针算法思想 二、算法题精讲 2.1. 查找总价格为目标值的两个商品 2.2. 盛最多水的容器 ​编辑 2.3. 移动零 2.4. 有效的三角形个数 一、双指针算法思想 双指针算法主要用于处理数组、链表等线性数据结构…...

作业day4

请实现一个终端的功能&#xff0c;注意需要带有cd功能 typedef struct sockaddr_in addr_in_t; typedef struct sockaddr addr_t; typedef struct sockaddr_un addr_un_t; char *mygets(char* s,int size){char* res fgets(s,size,stdin);int len strlen(s);if(s[len-1] \n)…...

python日志处理logging

python日志处理logging 在项目开发中&#xff0c;日志信息是程序中必不可少的组成部分。每一种语言都有相应的日志模块&#xff0c;如java中log4j&#xff0c;而python中是通过logging模块来提供日志功能。 日志要哪些本质功能&#xff1f; 在分享日志logging模块之前&#…...

开发板目录 /usr/lib/fonts/ 中的字体文件 msyh.ttc 的介绍【微软雅黑(Microsoft YaHei)】

本文是博文 https://blog.csdn.net/wenhao_ir/article/details/145433648 的延伸扩展。 本文是博文 https://blog.csdn.net/wenhao_ir/article/details/145433648 的延伸扩展。 问&#xff1a;运行 ls /usr/lib/fonts/ 发现有一个名叫 msyh.ttc 的字体文件&#xff0c;能介绍…...

浅谈《图解HTTP》

感悟 滑至尾页的那一刻&#xff0c;内心突兀的涌来一阵畅快的感觉。如果说从前对互联网只是懵懵懂懂&#xff0c;但此刻却觉得她是如此清晰而可爱的呈现在哪里。 介绍中说&#xff0c;《图解HTTP》适合作为第一本网络协议书。确实&#xff0c;它就像一座桥梁&#xff0c;连接…...

为什么在网站上复制的图片不能直接粘贴到本地的原因及解决方法

一、图片的来源与格式 ①图片链接:许多网站展示的图片并不是直接嵌入在页面中的,而是通过URL链接到远程服务器上的图片。当你复制网站上的图片时,实际上复制的是图片的URL地址,而不是图片的本地文件。 ②动态加载:有些网站使用JavaScript或其他技术动态加载图片,可能通…...

conda配置channel

你收到 CondaKeyError: channels: value https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main not present in config 错误是因为该镜像源&#xff08;https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main&#xff09;可能没有被正确添加到 Conda 的配置文件中&…...

Javaweb学习之Mysql(Day5)

(一)Mysql概述 (1)MYSQL通用语法 SQL语句可以单行或多行书写,以分号结尾。 SQL语句可以使用空格/缩进来增强语句的可读性(即,空格和缩进不影响代码的执行)。 MySQL数据库的SQL语句不区分大小写。 注释: 1. 单行注释: -- 注释内容 或 # 注释内容 (MySQL 特有 …...

61.异步编程1 C#例子 WPF例子

和普通的任务绑定不太相同的部分如下&#xff1a; public MainWindowViewModel(){FetchUserInfoCommand new RelayCommand(async (param) > await FetchUserInfoAsync());}private async Task FetchUserInfoAsync(){// 模拟异步操作&#xff0c;比如网络请求await Task.Del…...

自定义数据集 使用scikit-learn中svm的包实现svm分类

引入必要的库 import numpy as np from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.metrics import accuracy_score, classification_report 生成自定义数据集 X, y ma…...

Qt跨屏窗口的一个Bug及解决方案

如果我们希望一个窗口覆盖用户的整个桌面&#xff0c;此时就要考虑用户有多个屏幕的场景&#xff08;此窗口要横跨多个屏幕&#xff09;&#xff0c;由于每个屏幕的分辨率和缩放比例可能是不同的&#xff0c;Qt底层在为此窗口设置缩放比例&#xff08;DevicePixelRatio&#xf…...

Python零基础快速入门课程,自带在线运行环境

Python零基础入门教程 编译器地址: Python在线编译器 课程目录: Python简介 Python是一种简单易学、功能强大的编程语言。它具有高效的数据结构,能够简单有效地实现面向对象编程。 Python的优点: 简单易学,所有人都可以零基础入门开源免费,有丰富的免费学习课程跨平台…...

Java 数据库连接池:HikariCP 与 Druid 的对比

Java 数据库连接池&#xff1a;HikariCP 与 Druid 的对比 数据库连接池&#xff1a;HikariCP 1. 卓越的性能表现 HikariCP 在数据库连接池领域以其卓越的性能脱颖而出。 其字节码经过精心优化&#xff0c;减少了不必要的开销&#xff0c;使得连接获取和释放的速度极快。 在…...

51单片机 04 编程

一、模块化编程 .c文件&#xff1a;函数、变量的定义 .h文件&#xff1a;可被外部调用的函数、变量的声明 函数在调用前必须有定义或者声明。 预编译&#xff1a;以#开头&#xff0c;作用是在真正的编译开始之前&#xff0c;对代码做一些处理&#xff08;预编译&#xff09…...

基于Springboot框架的学术期刊遴选服务-项目演示

项目介绍 本课程演示的是一款 基于Javaweb的水果超市管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附…...

Vite:现代前端开发的利器

Vite&#xff1a;现代前端开发的利器 随着前端技术的快速发展&#xff0c;开发工具也在不断迭代和优化。Vite 是近年来备受关注的一款前端构建工具&#xff0c;它以极快的冷启动速度和高效的开发体验赢得了开发者的青睐。本文将详细介绍 Vite 的特点、工作原理以及它为何成为现…...

[蓝桥杯 2024 省 B] 好数

[蓝桥杯 2024 省 B] 好数 题目描述 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位……&#xff09;上的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位……&#xff09;上的数字是偶数&#xff0c;我们就称之为“好数”。 …...

基于Flask的全国星巴克门店可视化分析系统的设计与实现

【FLask】基于Flask的全国星巴克门店可视化分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为主要开发语言&#xff0c;结合Flask框架进行后端开发&…...

2502,索界面3

原文 SonicUI,你从未见过的方便GUI引擎-源码 介绍 SonicUI是基于原生GDIAPI的GUI引擎.它提供了几个简单的UI组件来实现高效的UI效果,如自绘按钮,不规则窗口,动画,窗口中的网径和图像操作方法. 主要目的是用最少的代码来达到最佳效果. 背景 周知,UI开发一般重复用无趣.因此…...

基础笔记|splice()的用法

一、三种用法 splice(index, 0, element) 插入 元素&#xff0c;不删除任何元素。splice(index, deleteCount) 删除 deleteCount 个元素。splice(index, deleteCount, element1, element2, ...) 替换 元素&#xff0c;即删除 deleteCount 个元素&#xff0c;同时插入新的元素。…...

电商项目高级篇09-检索服务

电商项目高级篇09-检索服务 1、环境搭建1.1、前端静态文件准备1.2、search服务引入模版引擎1.3、index.html页面复制到templates文件夹下1.4、模仿product项目&#xff0c;引入名称空间1.5、动静分离&#xff0c;静态资源路径位置替换1.6、将1.1的静态资源放到nginx目录下1.7、…...

如何使用 DeepSeek 和 Dexscreener 构建免费的 AI 加密交易机器人?

我使用DeepSeek AI和Dexscreener API构建的一个简单的 AI 加密交易机器人实现了这一目标。在本文中&#xff0c;我将逐步指导您如何构建像我一样的机器人。 DeepSeek 最近发布了R1&#xff0c;这是一种先进的 AI 模型。您可以将其视为 ChatGPT 的免费开源版本&#xff0c;但增加…...

Meta财报解读:营收超预期,用户增长放缓,AI与元宇宙仍是烧钱重点

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

2024美团秋招硬件开发笔试真题及答案解析

目录 一、单选题 1、C语言中变量有一系列的命名规则,下列选项中,属于错误的C语言变量命名规则的是() 2、以下 C 代码的运行结果是什么() 3、执行下面程序,正确的输出是() 4、以下不正确的定义语句是() 5、执行语句for (i = 2; i++ < 7;);后, i 的值变为()…...

利用Vue编写一个“计数器”

目录 一、利用Vue编写一个“计数器”的操作方法&#xff1a;二、html文件相关源代码三、CSS文件相关源代码四、代码执行效果展示如下 一、利用Vue编写一个“计数器”的操作方法&#xff1a; 1、data中定义计数器的相关数据&#xff0c;如num、min、max。 2、methods中添加计数…...

vscode搭建git

vscode搭建git 一、安装git二、vscode上搭建git(1) 先创建本地仓库再上传到远程仓库&#xff0c;远程仓库名是根据本地仓库名一致(2) 先创建远程仓库&#xff0c;再将本地仓库上传到指定远程仓库 一、安装git 网络教程很多&#xff0c;在此就不赘述了 参考&#xff1a;git安装…...

Dijkstra算法解析

Dijkstra算法&#xff0c;用于求解图中从一个起点到其他所有节点的最短路径。解决单源最短路径问题的有效方法。 条件 有向 带权路径 时间复杂度 O&#xff08;n平方&#xff09; 方法步骤 1 把图上的点分为两个集合 要求的起点 和除了起点之外的点 。能直达的写上权值 不…...

本地部署DeepSeek教程(Mac版本)

第一步、下载 Ollama 官网地址&#xff1a;Ollama 点击 Download 下载 我这里是 macOS 环境 以 macOS 环境为主 下载完成后是一个压缩包&#xff0c;双击解压之后移到应用程序&#xff1a; 打开后会提示你到命令行中运行一下命令&#xff0c;附上截图&#xff1a; 若遇…...

蓝桥杯算法笔记|差分学习

&#xff01;前情回顾 前缀和18437蓝桥账户中心 练习代码&#xff1a; #include <iostream> using namespace std; int main() {// 请在此输入您的代码int n,q;cin>>n>>q;int a[n];for(int i0;i<n;i){cin>>a[i];}int sum[n];sum[0]a[0];for(int …...

一文速览DeepSeek-R1的本地部署——可联网、可实现本地知识库问答:包括671B满血版和各个蒸馏版的部署

前言 自从deepseek R1发布之后「详见《一文速览DeepSeek R1&#xff1a;如何通过纯RL训练大模型的推理能力以比肩甚至超越OpenAI o1(含Kimi K1.5的解读)》」&#xff0c;deepseek便爆火 爆火以后便应了“人红是非多”那句话&#xff0c;不但遭受各种大规模攻击&#xff0c;即便…...

【Redis】主从模式,哨兵,集群

主从复制 单点问题&#xff1a; 在分布式系统中&#xff0c;如果某个服务器程序&#xff0c;只有一个节点&#xff08;也就是一个物理服务器&#xff09;来部署这个服务器程序的话&#xff0c;那么可能会出现以下问题&#xff1a; 1.可用性问题&#xff1a;如果这个机器挂了…...