SpringFramework:SpringBean的生命周期

news2025/7/12 7:34:02

SpringFramework:SpringBean的生命周期


文章目录

  • SpringFramework:SpringBean的生命周期
    • 一、SpringBean的生命周期
      • 1. 实例化 Bean
      • 2. 填充属性(DI)
      • 3. 初始化
      • 4. 销毁
    • 二、BeanDefinition
      • 1. 基本概念
      • 2. 大致结构
      • 3. Spring 构建它的优势
    • 三、BeanPostProcessor
      • 1. BeanFactoryPostProcessor
      • 2. BeanPostProcessor


一、SpringBean的生命周期

Spring IOC 容器管理的 Bean 默认都是单例设计模式,即每个 Bean 只有一个实例化 Bean 对象存在于 Spring IOC 容器中,因此 Spring IOC 容器负责管理 Bean 的产生,使用和销毁等生命周期。

在这里插入图片描述

1. 实例化 Bean

首先,实例化 Bean:

  • 对于 BeanFactory 容器,当客户向容器请求一个尚未初始化的 Bean 时,或初始化 Bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用 createBean 进行实例化
  • 对于 ApplicationContext 容器,当容器启动结束后,便实例化所有的 Bean

容器通过获取 BeanDefinition 对象中的信息进行实例化。并且这一步仅仅是简单的实例化,并未进行依赖注入。 实例化对象被包装在 BeanWrapper 对象中,BeanWrapper 提供了设置对象属性的接口,从而避免了使用反射机制设置属性。

容器通过获取 BeanDefinition 对象中的信息进行实例化。并且这一步仅仅是简单的实例化,并未进行依赖注入。

实例化对象被包装在 BeanWrapper 对象中,BeanWrapper 提供了设置对象属性的接口,从而避免了使用反射机制设置属性。

2. 填充属性(DI)

实例化后的对象被封装在 BeanWrapper 对象中,并且此时对象仍然是一个原生的状态,并没有进行依赖注入。 紧接着,Spring 根据 BeanDefinition 中的信息进行依赖注入。 并且通过 BeanWrapper 提供的设置属性的接口完成依赖注入。紧接着,Spring 会检测该对象是否实现了 xxxAware 接口,并将相关的 xxxAware 实例注入给 Bean。

  • BeanNameAware 的 setBeanName() 方法
  • BeanFactoryAware 的 setBeanDactory() 方法
  • ApplicationContextAware 的 setApplicationContext() 方法

3. 初始化

初始化 Bean,对各项属性赋初始化值。初始化前后执行 BeanPostProcessor,(作用于所有Bean)扩展点方法,对 Bean 进行修改。

4. 销毁

容器关闭后,如果 Bean 实现了 DisposableBean 接口,则会回调该接口的 destroy() 方法。如果配置了destroy-method 方法,则会执行 destroy-method 配置的方法。


二、BeanDefinition

1. 基本概念

一个 Java 对象和一个 Spring Bean 有什么区别?

这是一个经典的面试题,什么是 Java Object ?万物皆对象,在Java内部所有的类,经过创建之后都可以称之为一个对象,SpringBean也是一个java Object, 但是Spring Bean是脱离于 Java Object 的,为什么这么说呢?因为一个 Class 要想变成对象只需要 new 一下,就能够称之为一个对象,但是一个类要想变成一个 Spring Bean 就需要经过一系列的生命周期。

从上面的可以知道,Spring Bean 是一个特殊的 Java Object, 那么他肯定有和 Java Object 有不一样的地方!

Java 中 Class 对象可以描述一个 Java Object,但是因为 Spring Bean 是一个特殊的 JAVA Object,所以 Class 对象不能够完整的描述一个 Spring Bean,所以 Spring 官方单独开发了一个叫做 BeanDefinition 的类,来描述一个 SpringBean !

总结:Java 中 Class 对象可以描述一个 Java Object,但是因为 Spring Bean 是一个特殊的 JAVA Object,所以 Class 对象不能够完整的描述一个 Spring Bean,所以 Spring 官方单独开发了一个叫做 BeanDefinition 的类,来描述一个 SpringBean !

2. 大致结构

BeanDefinition 里面描述了很多的东西,大致包括:ClassName、BaseClassName、是不是懒加载、是不是存在依赖、是不是单例、是否设置@Primary、读取它的beanFactoryMethod、是否存在构造函数参数、构造方法参数、自动注入属性的值 …

它里面存放了Spring创建bean的过程中所需要的一切原料!

3. Spring 构建它的优势

Spring 构建 BeanDefinition 的优势如下:

提升效率:Spring 创建一个类是通过反射创建的,创建类的时候需要一些创建信息,比如 Class,比如注解信息等等,事先将这些信息缓存起来,在创建 Bean 的时候能够直接从缓存中获取从而达到提升创建效率的目的。
方便修改:Spring 创建对象的时候,创建的信息全部是通过 BeanDefinition 内存储的信息来创建对象的,所以,我们可以通过修改 BeanDefinition 内部特定的值来改变 Spring 创建对象的结果!
方便扩展:我们通过一些特定的接口,可以获取到一个类的所有的 BeanDefinition 信息,从而完成一些特定功能的实现!


三、BeanPostProcessor

1. BeanFactoryPostProcessor

我们现在通过上面的了解知道了一件事,就是 Spring 在创建对象之前会把 Class 转换成一个 BeanDefinition , 此时 Spring 为我们提供了一个扩展点,他可以在读取完全部的 Class转换为 BeanDefinition 之后,回调所有实现了 BeanFactoryPostProcessor 接口的实现类,并传入工厂对象,使得使用者能够对工厂对象内部的属性进行修改,例如:对BeanDefinition 内的信息进行修改,以达到操纵最终实例化 Bean 的目的!

说白了,他会在扫描完项目将 Class 转换 为 BeanDefinition 之后在进行实例化之前进行接口的回调!

2. BeanPostProcessor

这个类和上面那个类十分的相似,他有两个方法,两个方法的调用时机也不相同,他会在实例化之后,调用初始化方法之前进行第一次方法回调(postProcessBeforeInitialization),在执行完初始化方法之后又会进行一次回调(postProcessAfterInitialization),每次回调该类都会将当前创建好的 Bean 传递到方法内部,从而让开发者能够自定义的修改当前 Bean 的一些定义!


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

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

相关文章

深度学习必备Python基础知识充电2

一、python中的类 1.1 python中是有内置的数据类型的 intstr 1.2 创建新的数据类型 自定义类来实现这样的功能 二、年轻人的第一个python类 2.1 来尝试一下 # 年轻人的第一个自定义python类class Man:def __init__(self, name):self.name nameprint(initialized Succes…

【优雅的参数验证@Validated】@Validated参数校验的使用及注解详解——你还在用if做条件验证?

Validated参数校验的使用及注解详解你还在用if做条件验证吗?一、优雅的参数验证Validated1.Valid和Validated的用法(区别)2.引入并使用Validated参数验证二、javax.validation.constraints下参数条件注解详解三、自定义条件注解你还在用if做条件验证吗? …

【云原生之K8s】 Pod控制器

文章目录一、Pod控制器及其功用二、控制器的类型1.Deployment2.StatefulSet2.1 StatefulSet的组成2.2 常规service和无头服务区别2.3 示例小结3.DaemonSet4.Job5.CronJob一、Pod控制器及其功用 Pod控制器,又称之为工作负载(workload)&#x…

【毕业设计】机器视觉火车票识别系统 - python 深度学习

文章目录0 前言1 课题意义1.1 课题难点:2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别2.3.1 部分实现代码3 实现效果4 最后0 前言 🔥 Hi,大家好,这里是丹成学长的毕设系列文章! 🔥 对毕设有任何疑问…

疑似大厂泄露!阿里内部Redis教程笔记,细节点满/效率翻倍

Redis是一个key-value存储系统,是当下互联网公司广泛采用的NoSQL数据库之一,也是Java程序员应知应会的必备技术。 这套笔记教程采用Redis 6.2.1版本,内容由浅入深,循序渐进,从Redis的基本概念开启讲解,内容…

React核心技术浅析

1. JSX与虚拟DOM 我们从React官方文档开头最基本的一段Hello World代码入手: ReactDOM.render(<h1>Hello, world!</h1>,document.getElementById(root) );这段代码的意思是通过 ReactDOM.render() 方法将 h1 包裹的JSX元素渲染到id为“root”的HTML元素上. 除了在…

NVIDIA Grace Hopper架构深度解析

NVIDIA Grace Hopper架构深度解析 NVIDIA Grace Hopper Superchip 架构是第一个真正的异构加速平台&#xff0c;适用于高性能计算 (HPC) 和 AI 工作负载。 它利用 GPU 和 CPU 的优势加速应用程序&#xff0c;同时提供迄今为止最简单、最高效的分布式异构编程模型。 科学家和工程…

Python~Pandas 小白避坑之常用笔记

Python~Pandas 小白避坑之常用笔记 提示&#xff1a;该文章仅适合小白同学&#xff0c;如有错误的地方欢迎大佬在评论处赐教 文章目录Python~Pandas 小白避坑之常用笔记前言一、pandas安装二、数据读取1.读取xlsx文件2.读取csv文件三、重复值、缺失值、异常值处理、按行、按列剔…

pytest allure 生成报告过程

allure 下载地址&#xff1a;Releases allure-framework/allure2 GitHub 下载好后配置环境变量执行&#xff1a; allure --version 看见版本号就算配置成功了 pytest allure 生成报告过程 allure添加测试类名&#xff0c;方法名&#xff0c;步骤&#xff1a; allure.fea…

【附源码】计算机毕业设计JAVA教学成果管理平台录像演示

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

教你一招轻松搞定mp3格式转换

第一种&#xff1a;ncm转mp3 经常使用网易云音乐的朋友应该会发现&#xff0c;网易云VIP音乐下载后&#xff0c;有些音乐是ncm格式的&#xff0c;无法导入PR或者一些编辑软件。 解决方法如下&#xff1a; 利用在线网站处理——Convertio 第一步&#xff1a;打开谷歌浏览器客户端…

9家美发连锁店老板一天剪辑1000个视频,用呆头鹅批量剪辑软件剪

1.1呆头鹅批量剪辑软件核心优势 01.我们的产品是经过市场考验的&#xff0c;像有结果的人学习&#xff0c;买有结果的产品。 02.3年的打磨&#xff0c;更新和删除了200多个模块 03.100多次持续优化更新 04.10000个公司和工作室和个人的使用和建议。 05.一个用户至少做出100…

磁盘有空间但无法创建文件

面试原题 我们去面试的时候,面试官通常会问一个问题, “小伙子,你在这些年的工作中,遇到过什么棘手的问题没有? 面试官问这个问题,无非想知道以下几件事情 你有没有过处理疑难问题的经验你解决问题的思路和能力如何你是怎么解决的你解决完这个问题有哪些收获 面试错误示范 …

Java生成验证码+动态分析技术+【实训10】HTML信息隐藏(信息安全技术作业)

Java生成验证码 第1关&#xff1a;使用Servlet生成验证码 任务要求参考答案评论 任务描述相关知识 为什么要有验证码&#xff0c;什么是验证码如何使用Servlet生成验证码编程要求测试说明任务描述 本关任务&#xff1a;使用servlet生成验证码。 相关知识 验证码在我们登陆…

硬链接及软连接引出的inode

inode定义 inode是linux系统中用作数据索引的标识符。简单来说&#xff0c;inode指示了一个文件的基本信息&#xff0c;如inode编号、修改时间、文件的位置等。 如同一本书的目录&#xff0c;会直接告诉你想看的章节是在第几页。不同的是&#xff0c;书是以页为单位的&#x…

软考 - 数据结构与算法

数据结构 线性结构 线性表 存储结构 顺序存储&#xff1a;用一组地址连续的存储单元 依次存储线性表中的数据元素&#xff0c;使得逻辑上相邻的元素物理上也相邻。 链式存储&#xff1a;存储各数据元素的结点的地址并不要求是连续的&#xff0c;数据元素逻辑上相邻&#xff…

提升Mac运行速度的三大方法

任何一部电子设备在使用多年之后都会出现性能下降的问题&#xff0c;苹果的Mac计算机自然也不例外。当你发现Mac运行缓慢&#xff0c;因为有太多文件或缓存垃圾将Mac的运行速度拖了下来。 要想提高生活和工作效率&#xff0c;必须对Mac进行优化&#xff0c;提升一下Mac 的使用性…

全业务链管理平台Odoo

什么是 Odoo ? Odoo 是一款非常容易使用又完全集成的商业应用&#xff0c;是一站式全业务链管理平台。 docker cli 安装 本项目涉及到 2 个容器&#xff0c;之前我们在下面&#x1f447;这些文章中 开源的看板管理工具Wekan类Trello的看板软件Planka群晖上安装MediaWiki的简…

linux系统java环境变量的下载与安装

由于目前好多工具的安全使用需要安装java环境&#xff0c;所有今天就分享一下java环境变量的安装与配置下载地址&#xff1a; https://download.oracle.com/otn/java/jdk/8u351-b10/10e8cce67c7843478f41411b7003171c/jdk-8u351-linux-i586.tar.gz?AuthParam1668564371_517fa4…

【2022.11.16】Lammps+Python+MATLAB在绘制维诺图时遇到的问题

目录写在前面绘制g6(r)执行步骤问题1&#xff1a;数据导入问题2&#xff1a;利用Python选取想要的数据问题3&#xff1a;如何找到每个点的最近邻问题4&#xff1a;绘制维诺图写在前面 记录一下做毕设时候遇到的问题 大目标是绘制g6的图片 相关文章&#xff1a; [1] Zu M , Li…