Spring三级缓存是如何作用的

什么是三级缓存

  • singletonObjects: 一级缓存,用于保存实例化、注入、初始化完成的bean实例【完全体】
  • earlySingletonObjects: 二级缓存,用于保存实例化完成的bean实例
  • singletonFactories: 三级缓存,用于保存bean创建工厂,以便于后面扩展有机会创建代理对象。

什么是循环依赖

一个或者多个对象之间存在直接或者间接的依赖关系,形成一个环状依赖。
存在:自己依赖自己;两者互相依赖(如下图);多个对象间接依赖。
在这里插入图片描述
代码示例,以下会以此代码示例讲解:

@Service
public class DemoServiceImpl_01 {@Autowiredprivate DemoServiceImpl_02 demoServiceImpl_02;
}@Service
public class DemoServiceImpl_02 {@Autowiredprivate DemoServiceImpl_01 demoServiceImpl_01;
}

bean加载流程

在这里插入图片描述

spring能解决循环依赖的本质

spring能解决循环依赖的本质是:bean的实例化和初始化是分开执行的,利用三级缓存的设置可以将实例化后的对象缓存到二级缓存,在依赖注入的时候会先尝试从一级缓存获取对象,如果没有再尝试从二级缓存,三级缓存中去获取。
以下我们先举个循环依赖的例子:

// TestService1,TestService2都只有唯一一个构造器,实例化的时候就必须处理依赖注入的对象TestService2
// 但是依赖注入的对象TestService2的实例化也依赖TestService1的实例化,因此造成循环依赖@Service
public class TestService1 {public TestService1(TestService2 testService2) {}
}@Service
public class TestService2 {public TestService2(TestService1 testService1) {}
}运行结果:
Requested bean is currently in creation: Is there an unresolvable circular reference?

探究三级缓存的必要性

一级缓存是否必须存在

一级缓存,用于保存实例化、注入、初始化完成的bean实例【完全体】,毋庸置疑,一级缓存必须存在。

二级缓存是否必须存在

讨论这个问题,我们得知道三级缓存中的ObjectFactory具体是干什么的?
在这里插入图片描述

从源码可以看出,在bean实例化之后,初始化之前,spring会将实例化好的bean封装成一个ObjectFactory对象放入三级缓存,那么这么做是为什么呢?其实是为了做AOP增强。
在这里插入图片描述
AbstractAutoProxyCreator 继承 SmartInstantiationAwareBeanPostProcessor,SmartInstantiationAwareBeanPostProcessor正是ObjectFactory#getEarlyBeanReference里面要处理的后置处理器。

在这里插入图片描述
那么回到正题,知道了三级缓存的作用,为什么二级缓存必须得有呢?
在这里插入图片描述
当调用getBean()时,会先尝试从缓存中获取(如上图代码),这时候是一级缓存->二级缓存->三级缓存,这里面会有一个细节:从三级缓存中取完后会将对应ObjectFactory删掉,然后将获取的对象放入二级缓存;这时候如果没有二级缓存的话,每次走到此处都要从三级缓存中获取对象,如果对象需要代理,那么每次获取到的代理对象将会不是同一个对象,故二级缓存必须有。

三级缓存是否必须存在

其实我一直有一个疑问,我是否可以不要三级缓存,在添加三级缓存时,我立马处理bean的增强逻辑,并将增强后的bean存入二级缓存?

其实从bean生命周期设计的角度来看,最好是当我实例化,初始化完成后再去考虑增强的事,从源码设计来看,利用三级缓存存储ObjectFactory来实现AOP增强的滞后处理。

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

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

相关文章

java面向对象总结

java面向对象篇到这里就已经结束了,有什么不懂的地方可以逐一进行重新观看。希望大家能够从入门到起飞。 Java面向对象基础篇综合训练(附带全套源代码及逐语句分析)->基于javabeen Java面向对象进阶篇综合训练(附带全…

2024 Java 高分面试宝典 一站式搞定技术面

前言 每年9月和10月,被业界称为“金九银十”,这是人才市场一年中最活跃的时期。此时,企业为了来年的业务扩展,纷纷加大招聘力度,空缺岗位众多,招聘需求集中。同时,初秋的招聘活动也避开酷暑&am…

操作系统:高级IO

高级IO 1.关于IO IO的基本类型: I代表输入(Input): 从外部设备或来源(如键盘、鼠标、文件、网络)读取数据到计算机中。示例:用户键入的文本、从文件读取的数据、从网络接收到的数据包。 O代表输出(Output): 将计算机处理后的数据发…

git 版本回退-idea

1、选中项目,右键,打开 git历史提交记录 2、选中想要回退的版本,选择 hard(不保留版本记录) 3、最终选择强制提交(必须强制) OK,搞定

OpenCV 图像预处理—图像金字塔

文章目录 相关概念高斯金字塔拉普拉斯金字塔应用 构建高斯金字塔为什么要对当前层进行模糊?1. 平滑处理2. 减少混叠(Aliasing)3. 多尺度表示4. 图像降采样 举个栗子创建高斯金字塔和拉普拉斯金字塔,并用拉普拉斯金字塔恢复图像 相…

【PyTorch】基于YOLO的多目标检测项目(二)

【PyTorch】基于YOLO的多目标检测项目(一) 【PyTorch】基于YOLO的多目标检测项目(二) YOLO-v3网络由跨距为2的卷积层、跳跃连接层和上采样层组成,没有池化层。网络接收一幅416 * 416的图像作为输入,并提供三…

C++从入门到入土(三)--6个默认成员函数

目录 前言 什么是默认成员函数 构造函数 概念 特性 析构函数 概念 特性 拷贝构造函数 概念 特性 赋值运算符重载 特性 前言 很久没有更新文章了,最近把类和对象相关的知识重新回顾了一遍,打算从今天开始继续更新C从入门到入土系列。前面我们…

DVWA中SQL注入漏洞细说

SQL注入是一种安全漏洞,它允许攻击者通过影响Web应用程序的后端数据库。攻击者可以通过在输入字段中插入恶意SQL代码来执行非授权查询,从而获取或修改数据。 在开始启动SQL注入之前我们先将DVWA的安全等级调整到Low 1、我们在SQL Injection中输入 1 and…

Linux文件恢复

很麻烦 一般还是小心最好 特别恢复的时候 可能不能选择某个文件夹去扫描恢复 所以 删除的时候 用rm -i代替rm 一定小心 以及 探索下linux的垃圾箱机制 注意 一定要恢复到不同文件夹 省的出问题 法1 系统自带工具 debugfs 但是好像不能重启? testdisk 1、安装 …

Flink笔记整理(四)

Flink笔记整理(四) 文章目录 Flink笔记整理(四)六、Flink中的时间和窗口6.1 窗口(Window)窗口的概念窗口的分类窗口API概览窗口分配器窗口函数(Window Functions) 6.2 时间语义&…

MySQL的库操作和表操作

文章目录 MYSQLSQL语句分类服务器,数据库和表的关系 库操作表操作 MYSQL SQL语句分类 DDL【data definition language】 数据定义语言,用来维护存储数据的结构代表指令: create, drop, alterDML【data manipulation language】 数据操纵语言&#xff0…

关键路径算法(Critical Path)

这个算法《算法导论》中并没有提及,很多书和博客说的有点奇怪,所以写本文作为笔记。 关键路径是什么 关键路径的定义非常简单:就是一个图中,权值之和最大的路径就是关键路径。 那么就可以知道关键路径不唯一。 为什么有关键路…

安装 moleculeSTM 踩坑日记

“学习 LLM ,在大模型时代为自己存张船票”。 相信很多人都有这样的想法。那么,在 AI for science 领域,哪些 LLM 模型值得一试呢? 笔者认为: LLM 直接预测 SMILES 性质 or 直接生成 SMILES 的技术路线是行不通的。因…

搭建DNS正向解析,反向解析+搭建DNS主从架构+搭建DNS多区域+时间同步

主要在局域网中配置,不存在外网 正向解析:域名解析为IP named.conf 解决权限 named.rfc1912.zones 解决解析方式 环境准备:三台机器都做下面的操作 基础配置:网络配置,关闭安全架构,关闭防火墙&#x…

使用langchain4j调用大模型写个聊天助手

LangChain4j是一款基于Java的高效、灵活的AI大模型应用框架,专为简化Java应用程序与LLMs(大语言模型)的集成而设计。它提供统一API和模块化设计,支持多种LLM提供商和嵌入模型,以及丰富的工具箱,如AI服务和R…

光伏混合储能直流微网直流母线电压下垂控制MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 模型简介 此模型以混合储能系统为研究对象,采用基于关联参数SOC的改进下垂控制策略,将初始下垂系数与储能单元SOC的n次幂的比值作为现行下垂系数,通过改变n值,…

【快速上手ESP32(ESP-IDF)】ADC数模转换(含单次转换和连续转换以及校准)

这篇为重置版。 因为准备录制视频了,然后回过头看看之前讲ADC的文章发现有不少错误的地方(但是代码是可以用的),而且讲的也不全面,因此决定写下这个重置版。 这边提供三种使用ADC的方法,第一种是老方法&a…

港科夜闻 | 香港科大与阿里巴巴合作,计划成立大数据与人工智能联合实验室

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与阿里巴巴合作,计划成立大数据与人工智能联合实验室。香港科大7月19日与阿里巴巴集团签署合作备忘录,计划成立「香港科技大学–阿里巴巴大数据与人工智能联合实验室」,就生成…

科普文:万字梳理31个Kafka问题

1、 kafka 是什么,有什么作用 2、Kafka为什么这么快 3、Kafka架构及名词解释 4、Kafka中的AR、ISR、OSR代表什么 5、HW、LEO代表什么 6、ISR收缩性 7、kafka follower如何与leader同步数据 8、Zookeeper 在 Kafka 中的作用(早期) 9、Kafka如何快…