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

Spring中Bean生命周期及循环依赖

spring中所说的bean对象我们自己new的对象(原始对象)是不同的;

bean对象是指spring框架创建管理的我们的对象

生命周期即:何时生,何时死

1.实例化 Instantiation:

spring通过反射机制以及工厂创建出来的原始对象;

2.属性赋值 Populate:

对对象中属性进行赋值操作

3.初始化 Ininitialization:

在这个阶段完成对原始对象的各种功能增强,如AOP生成代理对象、实现下面的接口方法等:

这些是初始化阶段可以实现的接口,以及接口中的方法:
3.1 如果 Bean 实现 BeanNameAware 执行 setBeanName
3.2 如果 Bean 实现 BeanFactoryAware 或者ApplicationContextAware 设 置工厂 setBeanFactory 或者上下文对象 setApplicationContext 对象.
3.3 如果存在类实现 BeanPostProcessor(AOP),执行postProcessBeforeInitialization
3.4 如果 Bean 实现 InitializingBean 执行 afterPropertiesSet如果配置了自己的初始化方法<bean init-method="init">
3.5 如果存在类实现 BeanPostProcessor(AOP) ,执行postProcessAfterInitialization

如下@transactional标签实现事务管理,同时这个类也实现了两个接口,实现了接口的方法:

这些都是在初始化阶段需要完成的;等这些都完成后,bean对象就算是真正意义上的创建完成了

完成后就把bean对象放入到容器中使用

4.销毁

如果 Bean 实现 DisposableBean 执行 destroy 如果配置了自己的销毁方法<bean destroy-method="customerDestroy">

指定销毁方法 customerDestroy

bean生命周期具体流程图:

Spring中的bean是线程安全的吗?

servlet是线程安全的吗?不是,因为servlet对象只创建了一个,所以属性值也就只有一个,当有多个请求(线程)访问同一个值时,就会出现线程安全问题、共享问题;

spring中的bean是否是线程安全的,要看它的作用域,即scope

若是Singleton,即单例,那就是线程不安全,所有线程都共享一个单例实例Bean,可以使用ThreadLocal解决,为每一个线程创建一个变量副本;

若是prototype,即原型的 多例 是线程安全的,一个请求到来,创建一个对象,bean之间不存在Bean共享,自然不会出现线程安全问题。

bean又分为 有状态bean无状态bean

1.有状态:可以用来存储数据

2.无状态:不会存储数据,如Service层,Dao层只是方法调用

如果单例 Bean,是一个无状态 Bean,也就是线程中的操作不会对 Bean 的成员执行查询以外的操作,那么这个单例 Bean 是线程安全的。比如 Spring mvc 的 Controller、Service、Dao 等,这些 Bean 大多是无状态的,只关注于方法本身。

但是如果单例Bean 是有状态的,那就不能保证线程安全, 那就需要开发人员自己来进行线程安全的保证,最简单的办法1.就是改变 bean 的作用域把 "singleton"改为’‘protopyte’‘, 这样每次请求 Bean 就相当于是 new Bean() 这样就可以保证线程的安全了。 2.就是使用Threadlocal线程池存储变量,为每个线程创建一个变量副本

controller、service 和 dao 层本身并不是线程安全的,只是如果只是调用里面的方法,而且多线程调用一个实例的方法,会在内存中复制变量,这是自己的线程的工作内存,是安全的。

Bean循环依赖


java中循环依赖场景:

很简单,A类关联了B类,B类同时也关联了A类;

如果是纯粹的java语言,即不考虑spring,自己new对象时,是没有任何问题的,因为对象之间相互关联是很常见的事,我们直接将关联在内的对象初始化赋值为null,然后相互赋值即可,如下。

Spring产生循环依赖问题

但是在spring管理bean时,在自动注入时,如果两个类相互之间关联,那么会出现注入一个对象时,另一个对象还没有初始化完成(bean对象需要经历初始化过程)。总之一个对象并不会简单new出来,而是会经过一系列的Bean的声明周期,就是因为Bean的生命周期所以才会出现循环依赖问题。

如何产生循环依赖问题:主要是:A创建时→需要B----B去创建→又需要A

Spring解决循环依赖

spring提供了 三级缓存机制来解决这个问题:

在 DefaultSingletonBeanRegistry 类中定义了 3 个 Map 对象充当缓存;

singletonObjects: 一级缓存,用于保存实例化、注入、初始化完成的 bean实例,即已经完全初始化的bean对象;

earlySingletonObjects:二级缓存,用于保存实例化完成的 半成品bean 实例,即就是刚创建出的半成品对象,未经初始化,提前曝露对象给需要的地方。

singletonFactories: 三级缓存,用于保存创建 bean 对象的工厂

具体过程:

当A中需要B时,那么先从一级缓存中找B,没有,然后到二级缓存中找B,若也没有,则去三级缓存中,找到B对应的工厂,创建出B对象(原始对象,半成品),把B对象存入二级缓存中,如下:

主要通过三级缓存解决Bean循环依赖问题:

出现问题的根本原因是实例化和初始化是分开处理的。

相关文章:

Spring中Bean生命周期及循环依赖

spring中所说的bean对象 与 我们自己new的对象(原始对象)是不同的&#xff1b;bean对象是指spring框架创建管理的我们的对象生命周期即&#xff1a;何时生&#xff0c;何时死1.实例化 Instantiation&#xff1a;spring通过反射机制以及工厂创建出来的原始对象&#xff1b;2.属性…...

【3.1】MySQL锁、动态规划、Redis缓存,过期删除与淘汰策略

5.4 MySQL死锁了&#xff0c;怎么办&#xff1f; RR隔离级别下&#xff0c;会存在幻读的问题&#xff0c;InnoDB为了解决RR隔离级别下的幻读问题&#xff0c;就引出了next-key 锁&#xff0c;是记录锁和间隙锁的组合。 Record Lock&#xff0c;记录锁&#xff0c;锁的是记录本身…...

Python+Yolov5跌倒检测 摔倒检测 人物目标行为 人体特征识别

PythonYolov5跌倒检测 摔倒检测 人物目标行为 人体特征识别如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<PythonYolov5跌倒摔倒人体特征识别>>编写代码&#xff0c;代码整洁&…...

计算机底层:储存器的性能指标(CPU和内存等硬件的性能以及 对比标准)

计算机底层&#xff1a;储存器的性能指标(CPU和内存等硬件的性能以及 对比标准) 内存&#xff1a; MAR是存放地址的寄存器&#xff1b;MDR是存放数据的寄存器。 MAR是存放地址的寄存器&#xff0c;那么其中的二进制位一定是不能重复的&#xff0c;试想&#xff0c;如果有有两个…...

操作留痕功能实现与探讨

操作留痕功能实现与探讨 背景 接手了一个单体应用项目&#xff0c;看系统介绍&#xff0c;说实现了【高性能的操作日志留痕】功能&#xff0c;就有点好奇它是怎么设计的&#xff0c;是阻塞队列还是怎样的线程池。结果我打开代码一看&#xff0c;真的是笑洗个人了。它是做了一…...

深入浅出消息队列MSMQ

消息队列MSMQ&#xff0c;相信稍有开发经验的小伙伴都了解一些。开始讲解之前&#xff0c;我们先弄清楚一件事&#xff0c;为什么我们要使用MSMQ&#xff1a; 您可能认为您能够通过一个简单的数据库表(一个应用程序往其中写入数据&#xff0c;另一个应用程序从中读取数据)来应用…...

Maven多模块开发

POM主要功能 maven学习教程很多&#xff0c;就不在赘述可以参考以下网站&#xff0c;这里只说明maven实际运用。 https://blog.csdn.net/xwh3165037789/article/details/121545762 菜鸟教程 Maven POM POM是在使用Maven构建项目最重要的部分&#xff0c; POM 中所有信息位于&l…...

QT之OpenGL帧缓冲

QT之OpenGL帧缓冲1. 概述1.1 帧缓冲的创建与删除1.2 帧缓冲的数据来源1.2.1 数据源与帧缓冲的关系1.2.2 纹理Attachment1.2.3 渲染缓冲对象Attachment1.2.4 两者的区别1.2.5 关于两者的使用场景2. Demo3. 后期处理4. 参考1. 概述 OpenGL管线的最终渲染目的地被称作帧缓冲(fram…...

$ 6 :选择、循环

if-else语句 #include <stdio.h> //判断输入值是否大于0 int main() {int i;while (scanf("%d",&i)){if (i > 0)//不要在括号后加分号{printf("i is bigger than O\n");}else {printf("i is not bigger than O\n");}}return O; } …...

【项目设计】高并发内存池 (四)[pagecache实现]

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…...

玩转qsort——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容还是我们的深度剖析指针呀&#xff0c;上篇博客我们学习了回调函数这个知识点&#xff0c;但是没有写完&#xff0c;因为&#xff1a;小雅兰觉得qsort值得单独写出来&#xff01;&#xff01;&#xff01;好啦&#xff0c;就…...

【干货】又是一年跳槽季!Nginx 10道核心面试题及解析

Nginx是一款轻量级的高性能Web服务器和反向代理服务器&#xff0c;由俄罗斯的Igor Sysoev开发。它具有占用资源少、高并发、稳定性高等优点&#xff0c;被广泛应用于互联网领域。在Nginx的面试过程中&#xff0c;面试官通常会提出一些核心问题&#xff0c;本文将介绍一些常见的…...

【线程安全的HashMap有哪些,CurrentHashMap底层是怎么实现线程安全的】

在 Java 中&#xff0c;线程安全的 HashMap 通常有以下几种实现&#xff1a; Collections.synchronizedMap 方法&#xff1a;该方法可以将 HashMap 转换为线程安全的 Map。 Hashtable 类&#xff1a;Hashtable 是一种线程安全的集合类&#xff0c;它与 HashMap 类似&#xff0…...

C语言-结构体【详解】

一、 结构体的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量结构的每个成员可以是不同类型的变量 &#xff08;1&#xff09;结构体的声明 写法一&#xff1a; 注&#xff1a; 括号后边的分号不能忘结构体末尾可以不创建变量&#xff0c;在主函数中再创建 struc…...

浏览器输入url到页面渲染完成经历了哪些步骤

一、URL解析 这一步比较容易理解&#xff0c;在浏览器地址栏输入url后&#xff0c;浏览器会判断这个url的合法性 &#xff0c;以及是否有可用缓存&#xff0c;如果判断是 url 则进行域名解析&#xff0c;如果不是 url &#xff0c;则直接使用搜索引擎搜索 二、域名解析 输入…...

大数据技术之Hadoop(Yarn)

第1章Yarn资源调度器思考&#xff1a;1&#xff09;如何管理集群资源&#xff1f;2&#xff09;如何给任务合理分配资源&#xff1f;Yarn是一个资源调度平台&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而MapReduce等…...

5.建造者模式

目录 简介 四个角色 应用场景 实现步骤 和工厂模式的区别 简介 建造者模式也叫生成器模式&#xff0c;是一种对象构建模式&#xff1b;它可以把复杂对象的建造过程抽象出来(抽象类别)&#xff0c;使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象&#xff1b;…...

数据库基础-数据库基本概念(1-1)

你好&#xff0c;欢迎来到数据库基础系列专栏&#xff0c;欢迎留言互动哦~ 目录一、数据库基础1. 数据库基本概念1.1 数据库1.2 什么是数据库管理软件1.3 表1.4 行1.5 列和数据类型1.6 主键1.7 什么是 SQL一、数据库基础 1. 数据库基本概念 1.1 数据库 数据库是一个以某种有…...

学习笔记-架构的演进之服务容错策略-服务发现-3月day01

文章目录前言服务容错容错策略附前言 “容错性设计”&#xff08;Design for Failure&#xff09;是微服务的一个核心原则。 使用微服务架构&#xff0c;拆分出的服务越来越多&#xff0c;也逐渐导致以下问题&#xff1a; 某一个服务的崩溃&#xff0c;会导致所有用到这个服务…...

采编式AIGC视频生产流程编排实践

作者 | 百度人工智能创作团队 导读 本文从业务出发&#xff0c;系统介绍了采编式 TTV的实现逻辑和实现路径。结合业务拆解&#xff0c;实现了一个轻量级服务编排引擎&#xff0c;有效实现业务诉求、高效支持业务扩展。 全文6451字&#xff0c;预计阅读时间17分钟。 01 背景 近…...

基于硬件虚拟化的AI智能体安全隔离方案Clawcage设计与实现

1. 项目概述&#xff1a;为AI智能体打造一个坚不可摧的“笼子”如果你最近在尝试运行一些本地的AI智能体&#xff0c;比如Claude Desktop、Cursor的Agent模式&#xff0c;或者各种开源的AI助手工具&#xff0c;心里可能总会有点打鼓。这些工具功能强大&#xff0c;但它们背后运…...

半导体诊断技术:从扫描逻辑到根因解卷积

1. 半导体诊断技术演进与挑战 在半导体制造领域&#xff0c;诊断技术始终扮演着至关重要的角色。想象一下&#xff0c;当芯片在测试阶段出现故障时&#xff0c;工程师们就像医生面对病患一样&#xff0c;需要通过一系列"检查手段"来定位问题根源。扫描逻辑诊断&#…...

横空出世!IDEA最强MyBatis插件来了,功能很全!

最近更新了IDEA 2026.1这个版本&#xff0c;发现之前使用的MyBaitsX这个插件没有兼容&#xff0c;启动就报错&#xff01;于是就改用了MyBatisCodeHelper-Pro这个插件&#xff0c;体验了一把&#xff0c;提示很全&#xff0c;还有方便的MyBaits日志转SQL面板&#xff0c;这里分…...

欧洲千亿欧元纳米电子战略:产业政策、研发投入与市场拉动的博弈

1. 项目概述&#xff1a;一场关于欧洲纳米电子未来的千亿欧元豪赌2012年底&#xff0c;当欧洲大部分地区仍在应对欧债危机的余波时&#xff0c;一份名为《欧洲未来的创新&#xff1a;2020年后的纳米电子技术》的定位文件&#xff0c;在产业界投下了一颗重磅炸弹。这份由欧洲两大…...

企业智能体架构解析:从LLM集成到自动化管理实践

1. 项目概述&#xff1a;一个面向企业管理的智能体架构最近在开源社区里&#xff0c;我注意到一个挺有意思的项目&#xff1a;kernelshreyak/company-manager-agent。光看这个名字&#xff0c;你可能会联想到一个简单的任务管理工具&#xff0c;但深入研究后&#xff0c;我发现…...

Kotlin多平台集成OpenAI API:类型安全与协程流式处理实践

1. 项目概述&#xff1a;当Kotlin遇见OpenAI如果你是一名Android或Kotlin多平台&#xff08;KMP&#xff09;开发者&#xff0c;最近想在自己的应用中集成AI对话、图像生成或者语音转文本这类酷炫功能&#xff0c;那么你大概率绕不开OpenAI的API。但当你兴冲冲地打开官方文档&a…...

Vinkius Cloud扩展:在IDE中无缝管理MCP AI网关运行时

1. 项目概述&#xff1a;在IDE中管理你的AI网关运行时如果你正在开发或使用基于MCP&#xff08;Model Context Protocol&#xff09;的AI应用&#xff0c;那么你很可能已经体会过在多个AI客户端&#xff08;比如Cursor、Claude Desktop、Windsurf&#xff09;之间管理和维护后端…...

Agent Skill Exchange:标准化AI技能库,赋能智能编程助手

1. 项目概述&#xff1a;Agent Skill Exchange 是什么&#xff0c;以及它为何重要 如果你最近在折腾 Claude Code、Cursor 或者 Codex 这类 AI 编程助手&#xff0c;可能会发现一个痛点&#xff1a;虽然它们很强大&#xff0c;但要让它们真正理解并调用你项目里特定的工具链、…...

AI辅助开发实战:用Electron+React+TS构建跳台滑雪模拟器

1. 项目概述&#xff1a;一个由AI驱动的滑雪跳台模拟器如果你是一个体育游戏迷&#xff0c;尤其是对冬季项目里的跳台滑雪着迷&#xff0c;同时又对现代前端开发技术栈感兴趣&#xff0c;那么这个名为Sj.Sim Predazzo Edition的开源项目&#xff0c;绝对值得你花时间深入研究。…...

终极指南:3分钟解决Windows安装iPhone网络共享驱动难题

终极指南&#xff1a;3分钟解决Windows安装iPhone网络共享驱动难题 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_mi…...