首页 > 其他分享 >【Spring使用三级缓存解决循环依赖的过程】

【Spring使用三级缓存解决循环依赖的过程】

时间:2023-09-22 20:02:28浏览次数:35  
标签:缓存 对象 Spring testService1 实例 testService2 三级

testService1和testService2相互依赖 在这里插入图片描述

当Spring创建testService1对象时,它会先从一级缓存中查找是否存在testService1的实例。如果缓存中不存在testService1实例,它将继续查找二级缓存中是否存在testService1。如果二级缓存中也不存在testService1实例,则Spring会尝试从三级缓存中获取testService1的Bean工厂。

在三级缓存中,Spring会根据testService1的定义来创建一个新的Bean工厂对象,该工厂对象用来创建testService1实例。创建完成后,Spring会将该工厂对象添加到三级缓存中,并提前暴露Bean对象。这个过程中,testService1并没有被实例化,仍然是一个空对象。

当testService1需要进行属性赋值的时候,发现还有一个testService2,它没有赋值。这时,testService1会从一级缓存中去查找testService2是否已经有实例化的对象。如果在一级缓存中没有找到,那么它就会去二级缓存中查找,看是否已经有创建好的但是没有给属性赋值的对象。如果在二级缓存中也没有找到,那么它就会去三级缓存中查找,看是否有对象工厂可以创建提前暴露到bean的对象。如果都没有找到,那么Spring就会创建新的实例,然后将其添加到三级缓存中。三级缓存中存放的是包含Bean工厂对象的ObjectFactory对象,用来创建提前暴露到bean的对象。

这个时候testSerivce2对象里面发现testService1里面没有赋值,然后对testService1进行赋值,从一级缓存去查看,发现没有,去二级查看,发现没有,去三级查看,发现有,就把testService1从三级缓存添加到二级缓存里面,存放已经在内存空间创建好但是还没有给属性赋值的testService1对象,把testService1三级缓存用来创建提前暴露到bean的对象删除。

这个时候,testService2里面有实例对象,对象里面testService1的所有属性都被正确地赋值之后,testService2实例化完成了之后才把这个对象移动到一级缓存里面,存存放实例化testService2对象,把三级缓存里面的testService2删除。

这个时候testService1里面的testService2属性就可以从一级缓存里面获取这个testService2实例了,把它进行赋值填充,testService1也完成了实例化,把testService1从二级缓存添加到一级缓存里面,把testService1在二级缓存的实例也删除。

标签:缓存,对象,Spring,testService1,实例,testService2,三级
From: https://blog.51cto.com/liaozhiweiblog/7570644

相关文章

  • [SpringSecurity5.6.2源码分析十三]:LogoutFilter
    前言• SpringSecurity默认提供了登录的页面以及登录的接口,与之对应的也提供了登出页和登出请求• 登出请求对应的过滤器是LogoutFilter• 登出页对应的是DefaultLogoutPageGeneratingFilter、1.LogoutConfigurer• LogoutConfigurer是LogoutFilter对应的配置类,先看其主要方法......
  • 微信小程序全局变量(globalData)和缓存(StorageSync)的区别和用法
    globalData和storage的区别一、app.globalData是全局变量,下次进入的时候,就要重新获取,一般用于:1、保存一些可能涉及安全类的数据,例如资源类,每次需要很准确的,就建议用全局变量。2、全局变量每次关闭小程序重新打开的时候,都会进行初始化更新。二、缓存(StorageSync)本地存储,storage......
  • 缓存Cache
    研究生课程老师给了一篇论文,是关于缓存的,看完Abstract一脸懵逼之后决定来恶补一下,视频是观看的计算机组成原理(哈工大刘宏伟),这个随笔里的截图什么也都是视频里直接截图的,我只是想做个笔记自己之后再看~~~。一、缓存存在的目的程序局部性原理:通俗来讲就是一个变量在程序运行过程......
  • SpringSecurity用户登录限制
    本次给你介绍只允许用户在一个地方登录,也就是说每个用户只允许有一个Session。他有两种场景如果同一个用户在第二个地方登录,则将第一个登录下线如果同一个用户在第二个地方登录,则不允许二次的登录同一个用户在第二个地方登录,则将第一个登录退出具体步骤如下:重构com.security.learn.......
  • Spring 02 Spring注解开发
     dao层publicinterfaceUserDao{voidinsertUser();}实现类/*@Component(value="userDao")配置到实例里去或者直接用下面的Repository*/@Repository("userDao")publicclassUserDaoImplimplementsUserDao{@OverridepublicvoidinsertUser(......
  • SpringFramework介绍
    SpringFramework介绍2.1Spring和SpringFramework概念https://spring.io/projects广义的Spring:Spring技术栈(全家桶)广义上的Spring泛指以SpringFramework为基础的Spring技术栈。经过十多年的发展,Spring已经不再是一个单纯的应用框架,而是逐渐发展成为一个由多个不同子项......
  • SpringBoot中内置Servlet容器原理
    本篇博客会梳理一下SpringBoot内置Servlet容器的原理:原理其实跟SpringBoot中的内置Tomcat的启动原理差不多,我们从整个源码进行梳理一下。我们会发现当我们从Spring,SpringMVC演化到SpringBoot后发现采用SpringBoot后不需要配置Tomcat服务器了,这是什么原因呐,我们启动整个SpringBo......
  • 记录一下前端缓存分类汇总(indexDB、localStorage、sessionStorage)
    什么是缓存?当我们第一次访问网站的时候,比如juejin.cn,电脑会把网站上的图片和数据下载到电脑上,当我们再次访问该网站的时候,网站就会从电脑中直接加载出来,这就是缓存。缓存的优点和应用场景Web缓存种类:indexDB、localStorage、sessionStorage。缓解服务器压力,不用每次都去请......
  • 完整教程:使用SPRING BOOT实现大文件断点续传及文件校验
    一、简介随着互联网的快速发展,大文件的传输成为了互联网应用的重要组成部分。然而,由于网络不稳定等因素的影响,大文件的传输经常会出现中断的情况,这时需要重新传输,导致传输效率低下。为了解决这个问题,可以实现大文件的断点续传功能。断点续传功能可以在传输中断后继续传输,而不需......
  • SpringBoot疫苗在线预约接种系统
    SpringBoot疫苗在线预约接种系统系统功能首页:图片轮播宣传疫苗列表在线预约疫苗新闻资讯新闻详情登录注册留言板个人中心我的预约后台管理:登录新闻管理留言板管理回复管理预约管理用户管理疫苗库管理系统管理用户管理角色管理日志管理操作日志登录日志......