【spring的底层原理】Bean的生命周期

news2025/2/22 1:34:23

文章目录

  • 什么是`Bean`的生命周期
  • `Bean`的生命周期可以分为几个步骤
    • `Bean`的定义阶段
    • 加载`BeanDefinition`中指定的类
    • 实例化前(可选)
    • 实例化
    • 属性注入
    • `Aware`接口回调
    • `BeanPostProcessor`前置处理
    • 初始化
      • 初始化前(可选)
      • 初始化
      • 初始化后(可选)
      • Bean就绪使用
      • 销毁前(可选)
      • 销毁
  • 总结

什么是Bean的生命周期

Spring框架中,Bean的生命周期是指一个Spring容器中Bean从创建到销毁的整个过程Spring容器负责管理Bean的生命周期,通过依赖注入和面向切面的编程(AOP)为开发者简化了许多繁琐的操作。Spring框架提供了许多钩子方法,允许开发者在特定阶段执行自定义的逻辑。

Bean的生命周期可以分为几个步骤

Bean的定义阶段

  • Bean元信息配置:定义Bean的配置信息,包括类名、作用域、依赖等。
  • Bean元信息解析:将配置信息解析成Spring内部的BeanDefinition结构。
  • Bean注册:将BeanDefinition注册到Spring容器中。
  • BeanDefinition合并:类似于面向对象中的继承,一个BeanDefinition可以继承另一个BeanDefinition的属性。

加载BeanDefinition中指定的类

Spring框架中,“加载类”通常指的是Spring容器在创建Bean之前,需要先通过类加载器将Bean的类定义加载到JVM中。这是Bean生命周期的第一步,为后续的实例化、属性注入、初始化等步骤提供了基础.

实例化前(可选)

Spring提供了扩展点,允许在Bean实例化前执行一些逻辑。如果实现了InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation方法,并且返回了非null值,则Spring将不会进行默认的实例化,而是使用返回的对象进行后续操作。

实例化

通过反射机制创建Bean实例。此时,Bean对象被创建但还没有设置任何属性。(这里存在推断构造方法机制,在其他文章中会进行详解.)

属性注入

根据配置文件(如XML或注解)中提供的定义,为Bean注入属性.

Aware接口回调

如果Bean实现了Spring提供的某些特殊接口(例如BeanNameAwareBeanFactoryAwareApplicationContextAware等),Spring在这个阶段回调这些接口方法,传递相应的上下文信息给Bean

BeanPostProcessor前置处理

如果容器中有配置BeanPostProcessor接口实现类,它会在Bean初始化之前对Bean进行一些处理(例如代理、修改Bean的状态等)。这个阶段是在@PostConstructInitializingBeanafterPropertiesSet方法之前.

初始化

初始化前(可选)

如果Bean实现了InitializingBean接口,或者通过配置指定了自定义的初始化方法(例如在XML中定义init-method,或通过注解@PostConstruct),Spring会在这一阶段调用这些方法。

初始化

执行初始化操作,如设置Bean的状态、启动服务等。

初始化后(可选)

在初始化完成后,Spring容器会再次调用BeanPostProcessorpostProcessAfterInitialization方法,对Bean进行后续的处理操作,如代理增强等。这一步通常会用来做AOP的相关操作

Bean就绪使用

完成以上步骤后,Bean进入就绪状态,可以被应用程序正常使用。

销毁前(可选)

Spring容器关闭时,如果Bean实现了DisposableBean接口,Spring会调用其destroy方法。或者,可以通过配置文件或注解(@PreDestroy)来指定自定义的销毁方法。这一步主要用于释放资源、关闭连接等操作。

销毁

Bean被销毁,生命周期结束。

总结

上述过程看起来非常的复杂,但是我们总结起来无非是几个大块:
在这里插入图片描述

  • 注册Bean对象的信息,生成BeanDefinition对象
  • 调用构造方法,实例化Bean对象
  • 属性注入(@Autowird,构造方法注入,setter方法注入)
  • 调用Aware回调方法
  • 调用@PostConstruct注解或者实现的InitializingBean接口方法
  • 初始化
  • 调用BeanPostProcessor中的postmanProcessAfterInitialization方法,实现AOP

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

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

相关文章

全面前端显示:鹅成熟与否识别

1.背景意义 研究背景与意义 随着生态保护意识的增强和生物多样性的重要性日益凸显,水鸟尤其是加拿大鹅的保护与管理成为了生态学研究的一个重要领域。加拿大鹅在北美地区广泛分布,其种群数量的变化不仅反映了生态环境的健康状况,也对当地生…

label studio+sam实现半自动标注

1、主要参考:https://github.com/open-mmlab/playground/tree/main/label_anything 这里提醒大家一点,有人使用过程中,出现自动标注无反应,就是操作步骤出现了问题!一定记住按这个顺序操作!!&a…

Python爬虫案例八:抓取597招聘网信息并用xlutils进行excel数据的保存

excel保存数据的三种方式: 1、pandas保存excel数据,后缀名为xlsx; 举例: import pandas as pddic {姓名: [张三, 李四, 王五, 赵六],年龄: [18, 19, 20, 21],住址: [广州, 青岛, 南京, 重庆] } dic_file pd.DataFrame(dic) dic_file…

Hutool工具类生成二维码

1、引入依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutoo…

Java 基于SpringBoot+vue框架的老年医疗保健网站

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是Java Java 基于SpringBootvue框架的老年医疗保健网站。该系统采用 Java 语言开发&#xff0c;SpringBoot 框架&#xff0c;MySql 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强 &#xff0c;可供大…

华为FusionCube 500-8.2.0SPC100 实施部署文档

环境&#xff1a; 产品&#xff1a;FusionCube 500版本&#xff1a;8.2.0.SPC100场景&#xff1a;虚拟化基础设施平台&#xff1a;FusionCompute两节点 MCNA * 2硬件部署&#xff08;塔式交付场景&#xff09;免交换组网&#xff08;配置AR卡&#xff09; 前置准备 组网规划 节…

社团管理新体验:SpringBoot技术

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了社团管理系统的开发全过程。通过分析社团管理系统管理的不足&#xff0c;创建了一个计算机管理社团管理系统的方案。文章介绍了社团管理系统的系统分析部分&…

SSM之Bean

前言 这一节讲bean 1.初始spring 点projects Framework是spring的基础 spring官网 这三个主流 2. 系统架构 3. 核心概念 4. Ioc入门案例 其中Dao就是我们原来管理数据库的&#xff0c;service就是业务层 这个代码很简单 要交给spring管理&#xff0c;首先要有一个配置文…

Spring循环依赖如何解决的?

一、什么是循环依赖 循环依赖&#xff1a;说白是一个或多个对象实例之间存在直接或间接的依赖关系&#xff0c;这种依赖关系构成了构成一个环形调用。 第一种情况&#xff1a;自己依赖自己的直接依赖 第二种情况&#xff1a;两个对象之间的直接依赖 第三种情况&#xff1a;多个…

Mac vscode 激活列编辑模式

列编辑模式在批量处理多行文本时&#xff0c;非常有效&#xff0c;但 vscode 默认情况下&#xff0c;又没有激活&#xff0c;因此记录一下启动方法&#xff1a; 激活列编辑模式 然后就可以使用 Alt&#xff08;Mac 上是 Option 或 Command 键&#xff09; 鼠标左键 滑动选择了…

【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

商用密码应用安全性评估,密评整体方案,密评管理测评要求和指南,运维文档,软件项目安全设计相关文档合集(Word原件)

一、 密码应用安全性评估方案 &#xff08;一&#xff09; 密码应用测评工作思路 1.1.1. 测评准备活动的主要任务 1.1.2. 测评准备活动的输出文档 1.2. 方案编制活动 1.2.1. 方案编制活动的主要任务 1.2.2. 方案编制活动的输出文档 1.3. 现场预评估活动 1.3.1. 现场测评…

docker run m3e 配置网络,自动重启,GPU等 配置渠道要点

启动命令&#xff1a; docker run -d --restart always -p 6008:6008 --gpus all --name m3e --network fastgpt_fastgpt stawky/m3e-large-api 配置渠道m3e base url要像我这样填写才行&#xff0c;不然回出问题 模型要选m3e 密钥填&#xff1a;sk-aaabbbcccdddeeefffggghhhi…

OceanBase Shell开放内核运维接口,运维更便捷

DBA在日常业务中面临着繁琐的运维管理任务&#xff0c;亟需高效的工具和灵活的解决方案帮助他们简化操作、提升效率。因此&#xff0c;命令行操作和维护工具&#xff08;CLI工具&#xff09;&#xff0c;因其高效、灵活、可远程管理以及技术深度等特点&#xff0c;成为DBA和开发…

基于MATLAB的混沌序列图像加密程序

设计目的 图像信息生动形象&#xff0c;它已成为人类表达信息的重要手段之一&#xff0c;网络上的图像数据很多是要求发送方和接受都要进行加密通信&#xff0c;信息的安全与保密显得尤为重要&#xff0c;因此我想运用异或运算将数据进行隐藏&#xff0c;连续使用同一数据对图…

SMMU软件指南操作之翻译过程概述

安全之安全(security)博客目录导读 下图展示了每个传入事务&#xff08;transaction&#xff09;所经过的简化过程。本节描述了顶层翻译过程。 一个传入事务遵循以下步骤&#xff1a; 1. 如果 SMMU 被全局禁用&#xff0c;事务将直接通过 SMMU 而不进行任何地址改变。全局属性…

WEB-通用漏洞SQL注入CTF二次堆叠DNS带外

知识点&#xff1a; 1、数据库堆叠注入 根据数据库类型决定是否支持多条语句执行 数据库支持多条语句执行就是堆叠&#xff0c;如&#xff1a; 2、数据库二次注入 应用功能逻辑涉及上导致的先写入后组合的注入 3、数据库Dnslog注入 解决不回显&#xff08;反向连接&#…

基于 DRNN 神经网络整定的 PID 解耦控制

1. 基本原理 DRNN&#xff08;Dynamic Recurrent Neural Network, 动态递归神经网络&#xff09;是一种带有时间反馈的神经网络&#xff0c;能够建模系统的动态特性&#xff0c;适用于非线性、多变量、时变系统的控制。结合 PID 解耦控制&#xff0c;利用 DRNN 进行动态建模和…

【Spring Boot】用 MyBatis 实现数据的 CRUD

用 MyBatis 实现数据的 CRUD 1.创建项目 & 引入依赖2.实现数据表的自动初始化3.实现实体对象建模4.实现实体和数据表的映射关系5.实现增加、删除、修改和查询功能6.配置分页功能6.1 增加分页支持6.2 创建分页配置类 7.实现分页控制器8.创建分页视图 本篇博客将通过 MyBatis…

极坐标气泡图:医学数据分析的可视化新视角

在医学研究中&#xff0c;数据的可视化是至关重要的。它不仅能帮助我们更直观地理解数据&#xff0c;还能揭示数据中隐藏的模式和趋势。今天&#xff0c;我们要介绍一种独特的数据可视化工具——极坐标气泡图&#xff0c;以及它在医学中的重要作用。 什么是极坐标气泡图&#…