Spring Bean对象生命周期

news2024/10/7 16:25:56

文章目录

  • 前言
  • 基础
  • 通俗理解
  • bean作用域

前言

最近学习spring的一些基础概念,所以就先了解了bean对象的概念,而且发现这个里面涉及到很多的内容,比如在spring中一个bean对象是如何创建以及销毁的这些概念,所以就打算总结一些spring中的bean对象生命周期的内容

基础

在我们使用的Spring框架中,一定有一个概念是我们避不过去的,那就是bean 这个概念,bean是一个一个独立的对象,而对象就必然涉及到生命周期的概念,那么在bean对象中的生命周期有哪些呢?

一共六个阶段 Bean定义、实例化、属性赋值、初始化、生存期、销毁。

通俗理解

简单的来说,一个Bean的生命周期分为四个阶段:

1、 实例化(Instantiation)

2、 属性设置(populate)

3、 初始化(Initialization)

4、 销毁(Destruction)

这里我们先开始说实例化阶段,实例化阶段就是通过sprint的容器在创建运行时将我们的对象通过反射进行实例化,而这个时候实例化的对象内部是空的,也就是说我们这个对象中的成员属性还没有被赋值。

第二步是给这个对象中的属性进行赋值,这个操作,对应的就是上面说得属性设置(populate)


 // 基于BeanDefinition来创建bean
    private Object doCreateBean(String beanName, BeanDefinition beanDefinition) {
        Class beanClass = beanDefinition.getBeanClass();
           var code = "0e7f97a3-f7b8-46e5-a6a0-aea52f7a41af"
        try {
            //第一个阶段 实例化
            Constructor declaredConstructor = beanClass.getDeclaredConstructor();
            Object instance = declaredConstructor.newInstance();

            //第二个阶段 填充属性
            Field[] fields = beanClass.getDeclaredFields();
            for (Field field : fields) {
                if (field.isAnnotationPresent(Autowired.class)) {
                    String fieldName = field.getName();
                    Object bean = getBean(fieldName);

                    field.setAccessible(true);
                    field.set(instance, bean);
                }
            }
            
            //以下三个步骤都是在初始化阶段的前后进行执行的,所以属于初始化阶段的内容
            // Aware回调
            if (instance instanceof BeanNameAware) {
                ((BeanNameAware)instance).setBeanName(beanName);
            }

            // 初始化
            if (instance instanceof InitializingBean) {
                ((InitializingBean)instance).afterPropertiesSet();
            }

            for (BeanPostProcessor beanPostProcessor: beanPostProcessorList) {
                beanPostProcessor.postProcessAfterInitialization(beanName, instance);
            }

            return instance;
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        return null;
    }

单独说一下这部分

这里是三个spring中的三个接口,这三个接口对应的是BeanNameAware spring的一个回调接口,这个接口可以设置bean的名字

InitializingBean 这个是bean对象初始化的接口,这是在初始化是spring要调用的接口。

BeanPostProcessor 这个是bean对象初始化前后使用的的接口,也就是说bean对象生成前后的操作。

这三个接口是可以通过自己的对应的类去实现这个几个接口后spring在给你这个类生成bean对象时进行调用实现的接口。
在这里插入图片描述

这里给出的截图是一个spring bean配置信息。这里圈出部分是对应这个bean对象被创建和销毁的时候要执行的方法,可以看到init-method对应的参数是初始化方法,以及destory-method这里指定的销毁方法,也就是在bean被销毁的时候执行,还可以通过DisposableBean这个接口去实现销毁的方法,
在这里插入图片描述

以上这些就是spring bean对象的一个从出生到销毁经理的过程。

bean作用域

那么bean对象也有对应的作用域,比如一个普通的bean对象有单例和原型两种类型,单例类型的bean对象全局唯一,使用的是设计模式中单例模式,也就是说只会被创建一次,spring默认使用单例模式,而原型模式,这里的对象就是与单例相反,每次获取到的bean对象都是不一样的,它被创建出来以后就不会spring的容器管理了。

那说完普通的bean对象以后就要说到一些不普通的了,比如我们每次前端向后端发送请求的时候大家知道到后端以后会生成request对象,这个对象默认就不是单例模式,每次发送的请求中都会生成一个request对象。

还有一个关于在请求中使用的对象,seesion对象,这个对象是单例对象,它的生命周期保存到了一个完整的会话,也就是我们通过浏览器访问页面是这个页面如果不关闭,以及长时间不操作而超时,那么这个session对象是一直存在的。
在Spring框架中,Bean的作用域定义了每个Bean实例的生命周期和可见范围。Spring提供了以下几种常用的Bean作用域:

  1. 单例(Singleton):默认的作用域,每个容器中只有一个Bean实例存在,所有对该Bean的请求都会返回同一个实例。单例Bean在容器启动时被创建,直到容器关闭才销毁。

  2. 原型(Prototype):每次对Bean的请求都会创建一个新的实例。每个原型Bean在被请求时都会被实例化,Spring不会对其进行缓存或管理,因此需要手动管理这些Bean的生命周期。

  3. 会话(Session):每个会话(Web应用中的用户会话)都会产生一个独立的Bean实例。只适用于Web应用,每个用户会话中可以访问到自己的独立Bean实例,不同用户之间的会话互不干扰。

  4. 请求(Request):每个HTTP请求都会创建一个新的Bean实例。只适用于Web应用,每个请求中可以访问到自己的独立Bean实例,不同请求之间的Bean实例互不干扰。

除了上述的作用域,Spring还提供了一些其他的作用域,包括会话代理(Session-scoped proxy)和请求代理(Request-scoped proxy)。会话代理是会话作用域的Bean的代理对象,而请求代理是请求作用域的Bean的代理对象。这些代理对象可以在需要时延迟初始化和注入,避免过早地创建和销毁Bean实例。

在配置Bean的作用域时,可以使用XML配置文件、注解或Java配置类来指定作用域。例如,使用@Scope注解可以在Bean类上标注作用域,使用scope属性来指定作用域的名称。例如:

@Component
@Scope("prototype")
public class MyBean {
    // Bean的定义
}

上述代码将创建一个原型作用域的Bean。

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

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

相关文章

Spring MVC 学习总结

学习目标 了解 Spring MVC 是什么,为什么要使用它或者说它能解决什么问题,其与 Spring 是什么关系。理解为什么配置 Spring MVC 的前端控制器的映射路径为 “/” 会导致静态资源访问不了,掌握怎么处理这个问题。掌握基于注解方式使用 Spring…

分享一个vue-slot插槽使用场景

需求再现 <el-table-column align"center" label"状态" prop"mitStatus" show-overflow-tooltip />在这里&#xff0c;我想对于状态进行一个三目判断&#xff0c;如果为0那就是进行中&#xff0c;否则就是已完成&#xff0c;期初我是这样写…

九大常见数据结构

常用的数据结构可根据数据访问的特点分为线性结构和非线性结构。线性结构包括常见的链表、栈、队列等&#xff0c;非线性结构包括树、图等。 1 数组 数组可以说是最基本最常见的数据结构。数组一般用来存储相同类型的数据&#xff0c;可通过数组名和下标进行数据的访问和更新。…

self instruct 技术

《SELF-INSTRUCT: Aligning Language Model with Self Generated Instructions》 github: self-instruct 背景 大模型表现惊人&#xff0c;但是严重依赖于人工编写的指令数据。本文中提出self-instruct框架&#xff1a;一种基于大模型自动生成指令数据的方法。 主要步骤 1. …

[ DPU / SmartNIC/ 网卡 ]系统级的测试验证

开局一张图&#xff0c;其他慢慢来编 信雅纳DPU测试解决方案荣获第三届DPU峰会的“匠芯技术奖” 看完这张&#xff0c;小编再送一张&#xff1a;&#xff1a;&#xff1a; 网卡进化 更智能的加速卡SmartNIC/DPU 例如&#xff0c;将部分网络协议处理的功能卸载到 DPU 网卡&am…

Flutter(九)Flutter动画简介

1.动画简介 Animation、Curve、Controller、Tween这四个角色&#xff0c;它们一起配合来完成一个完整动画 Animation Animation是抽象类&#xff0c;和UI渲染没有关系&#xff0c;功能是保存动画的插值和状态&#xff1b;比较常用的是Animation addListener&#xff1a;帧监听…

EXCEL中点击单元格,所在行和列都改变颜色

1、打开VBA编辑环境。 2、选中需要添加程序的Sheet页面。 3、粘贴如下代码在编辑区域并保存后关闭。 Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) On Error Resume Next Cells.FormatConditions.Delete // 如下代码是行变&#xff0c;在粘贴到VBA中时…

【项目经理】如何说话有条理

如何说话有条理 1. PREP法则2. SCRTV模型3. FFC赞美法则4. RIDE 说服法则 1. PREP法则 2. SCRTV模型 3. FFC赞美法则 4. RIDE 说服法则

WiFi标签工作状态描述

1. LED 灯闪烁代表意义 蓝灯慢闪&#xff08;每隔 500ms 亮一次&#xff09;&#xff1a;标签进入到配置模式 蓝灯快闪&#xff08;每隔 100ms 亮一次&#xff09;&#xff1a; WIFI-TOOL 工具连接上了标签 蓝灯超快闪烁&#xff08;每隔 50ms 闪烁一次&#xff09;&…

每天一分享#读up有感#$记忆宫殿$

记忆宫殿&#xff0c;分享一位喜欢的up&#xff0c;粗略记录下今日鉴赏小结。 【记忆宫殿背句子-哔哩哔哩】 https://b23.tv/vzSCsek 所得 人的记忆就像水波&#xff0c;你只要记住一个中心它会自动往外扩散。 解惑了我记忆时先找关键字加顺序背诵的原理&#xff0c;只是up厉…

关于 MySQL、PostgresSQL、Mariadb 数据库2038千年虫问题

MySQL 测试时间&#xff1a;2023-8 启动MySQL服务后&#xff0c;将系统时间调制2038年01月19日03时14分07秒之后的日期&#xff0c;发现MySQL服务自动停止。 根据最新的MySQL源码&#xff08;mysql-8.1.0&#xff09;分析&#xff0c;sql/sql_parse.cc中依然存在2038年千年虫…

mongodb 分片集群部署

文章目录 mongodb 分片部署二进制安装三台config 配置shard 分片安装shard1 安装shard2 安装shard3 安装mongos 安装数据库、集合启用分片创建集群认证文件创建集群用户部署常见问题 mongodb 分片部署 二进制安装 mkdir -p /data/mongodb tar xvf mongodb-linux-x86_64-rhel7…

mac软件安装后打开软件显示损坏

#mac传输安装包后安装后打开软件显示损坏处理方式 以postman为例&#xff0c;输入前面的代码&#xff0c;打开访达&#xff0c;把有问题的软件拉到命令行窗口&#xff0c;确认即可 sudo xattr -r -d com.apple.quarantine /Applications/Postman.app

基于飞腾芯片的设计与调试入门指导

一、啥是自主可控 国产CPU现在厂家细算起来其实有很多,现在华为、小米也在做自己的CPU,瑞芯微、全志等的SoC现在也是广泛应用。但是真正能叫做自主可控的CPU厂商,只有6家。那啥是自主可控?首先来不严谨的讲下现在数字芯片是怎么做的设计。FPGA大家都知道,可以通过Verilog…

XP Power电源模块替代 HVF124000D-10W HVF15A6000D-10W 直流升压高压单路双路输出升压模块

F Features 最低工作电压&#xff1a;0.7V电压隔离&#xff1a;1000VDC /3000VDC 平均无故障时间&#xff1a; > 800,000 小时短路与电弧保护无最低负载要求&#xff1a;可空载工作输入电压&#xff1a;5、12、15、24VDCOutput 100,200、300、400、500 、600、800、 1000…

问道管理 :现金流若充裕 回购应是常态

许多闻名企业家将是否具有富余的现金流&#xff0c;置于企业运营风险的首位。看上去巨大的公司由于现金流开裂而轰然坍毁&#xff0c;已层出不穷。而富余的现金流是用于运营回购、股票分红还是理财出资&#xff0c;表现着公司对行业前景和估值水平的判别。 现金流富余的公司&am…

无套路,财务数据分析-多组织损益表分析分享

在报表众多的财务数据分析中&#xff0c;损益表是老板们最关注的报表&#xff0c;特别是当有多组织时&#xff0c;损益表的分析就变得更加重要了。以前受限于数据分析工具&#xff0c;做损益表分析时很难做到多维度灵活分析&#xff0c;但随着BI数据可视化工具的发展&#xff0…

【力扣 第 360 场周赛】题解(一题待补)

目录 2833. 距离原点最远的点2834. 找出美丽数组的最小和2835. 使子序列的和等于目标的最少操作次数TODO 2836. 在传球游戏中最大化函数值 这场比赛排名第 1 - 1000 名的参赛者 可获「NIO 蔚来」简历内推机会&#xff0c;比有的场次前十才给容易多了。 2833. 距离原点最远的点…

python下又一款漂亮超炫酷的动态数据可视化工具——可动态交互

python下有很多漂亮的数据可视化库&#xff0c;例如 Matplotlib、Seaborn、Bokeh、Plotly、Pyecharts等等&#xff0c;我们直接使用这些第三方库来进行漂亮的数据可视化操作。虽然这些库都可以很好的展示数据&#xff0c;但是在实现动态可交互上&#xff0c;很多库并不支持动态…

ssm公司信息管理系统源码和论文

ssm公司信息管理系统源码和论文071 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳…