Spring三级缓存问题?

使用三级缓存而不是二级缓存的原因是什么?
有的博客说是避免出现多个代理对象
还有的说是为了减少Bean对象引用的提前暴露
大家认为是为啥? #Java#
全部评论
三级缓存主要为了代理模式,做一个工厂,然后确定是否需要经过代理,然后将半成品(非代理/代理增强)放入二级缓存
3 回复 分享
发布于 2023-12-31 14:05 浙江
应该是和bean的生命周期相关,好像最开始就是两级缓存,后面加入了动态代理,改成了三级缓存,我在别的地方看到过帖子
2 回复 分享
发布于 2024-01-07 00:48 陕西
解决循环依赖吧
2 回复 分享
发布于 2023-12-31 16:03 陕西
网上大部分说的什么第三级关于aop都是不对的,其本质原因是如果只有两级,那么每次调用lambda表达式都是创建一个新的对象,因为在一个完整的依赖流程没有结束前,每次调用都是返回一个新的bean。首先明确一点一个完整的bean是需要实例化+初始化都完成了才会被放入一级缓存,那么比如a依赖b和c,b依赖a,c依赖a,那么执行流程是实例化a,发现需要b,实例化b,发现需要a,去一级缓存找到a没找到,去二级缓存找a没找到,去三级缓存创建a,半成品a被保存到二级缓存(由于a还有c需要创建,所以a暂时只会留在二级缓存,不会去一级缓存),b里面a使用的就是半成品对象,b被放入一级缓存,(现在b的流程结束了,返回对象a),发现a还是需要c,实例化c,发现c也需要a,去一级缓存里找没找到a,去二级缓存里面找,找到半成品a了,直接拿来用。看到了关键了吗?如果没有二级缓存,那在这里,c同样会去调用lambda表达式弄一个新的a出来,这也破坏了单例了,彻底错了
1 回复 分享
发布于 2024-01-21 18:56 上海
我觉得是保证bean的"单例属性",一个beanname对应一个bean,如果A有两个循环依赖,然后正好还进行了aop,不用三级缓存就会存两个代理对象。
1 回复 分享
发布于 2024-01-10 19:47 广西
二级缓存装的是半成品bean,考虑不用第三级只用前两级的情形:a实例化,放入二级缓存,属性填充 此时发现a依赖新bean b,去做bean b的创建,b实例化,放入二级缓存,属性填充 此时发现b依赖a 去二级缓存找a 命中了 给b装配上a。 在不考虑代理的情形,这是没问题。但如果a用了aop 真正该用的是a的aop增强的代理对象,但前面的逻辑b装配上的却是原始a! 第三级缓存我理解是去存了beanName,原始bean实例以及真正所需bean对象的创建逻辑。aop的话应该是用了个beanpostprocessor
1 回复 分享
发布于 2023-12-31 01:30 上海
应该是为了在没有出现循环依赖的情况下延迟代理对象的生成。
点赞 回复 分享
发布于 2024-04-11 14:39 湖北
打破循环依赖
点赞 回复 分享
发布于 2024-02-14 18:06 湖南
m
点赞 回复 分享
发布于 2024-02-04 20:58 广东
我觉得是本来aop代理是要在初始化之后生成的,但是如果没有三级缓存那你就必须在初始化之前给所有bean生成代理对象,这违背了spring结合aop的一个设计
点赞 回复 分享
发布于 2024-01-26 14:17 陕西
m
点赞 回复 分享
发布于 2024-01-25 00:55 广东
使用三级不是二级的主要目的是为了解决循环依赖问题中,在装配时产生动态代理对象和初始对象
点赞 回复 分享
发布于 2024-01-10 19:30 海南
没有第二级缓存,无法判断是否存在循环依赖。
点赞 回复 分享
发布于 2023-12-31 01:25 浙江

相关推荐

3.16投递3.17约一面3.20一面3.20约二面3.21二面一面无手撕,八股盛宴,三个面试官轮着面我二面无手撕,基本就是问实习和项目和学校的情况一、一面(40分钟)1、自我介绍2、final和finally的区别3、Object类的方法有哪些4、HashMap和ConcurrentHashMap有什么区别5、讲一下springboot6、IOC和AOP7、==与equals()区别8、多线程了解多少9、sleep()和wait()区别10、讲一下线程池11、gc垃圾回收了解多少12、垃圾回收算法有哪些13、介绍一下你实习查询优化是怎么做的14、五个字段ABCDE建立索引,BE查询走不走索引15、最左匹配原则16、还有什么情况下不走索引17、in用过吗18、查询年龄20到30的人(SQL)19、实习项目数据量有多少20、实习的时候有没有打表过几十万数据21、实习用过什么中间件22、Redis工作中都在哪用到过23、Redis数据类型有哪些24、讲一下缓存穿透、击穿、雪崩及其解决方案25、怎么保证Redis高可用持久化,集群,哨兵26、Redis和数据库数据怎么保证一致性27、了解我们公司干什么的吗28、你对我们公司这个行业有没有什么概念29、有没有向往的行业30、你那个agent项目是自己写的吗,怎么搭的架构,框架,部署,这些东西从哪获取的31、github,码云开源社区逛过吗32、开源社区一些优秀的项目和脚手架之类的有没有自己试过搭建部署在本地33、实习的时候有没有什么团队合作之类的34、有没有和用户做定时沟通35、反问:有二面吗(面完一个小时约二面)二、二面(30分钟)1、自我介绍2、第一段实习做的什么内容,你做了什么模块什么功能3、讲一下第一段实习项目的第二点怎么做的4、你第一段实习是4个月还是在上学时间,不耽误上课吗,有挂科的吗5、你第二段实习和第一段实习隔了两个月,期间在学校吗,为什么不干了6、你在IT技术圈里对什么感兴趣7、除了Java的技术栈你还学了其他的吗8、JavaScript会吗9、你第二段实习做的什么工作10、第二段实习项目的整个架构你了解吗,关于Java技术栈的方面是怎么样的结构11、微服务的架构里面又用到了哪些技术栈工具或者插件12、SpringBoot和SpringCloud有什么区别13、你刚才提到了项目架构用到了K8s,什么作用14、容器化部署你知道吗,优点是什么15、虚拟机知道吗,虚拟机和容器有什么区别16、数据库用过哪些17、Mabatis和MySQL怎么做查询,完成一个SQL语句的执行到结果需要用到哪些标签,说一下整个流程18、讲一下AI,讲一下你自己写的Agent项目整个流程怎么做的19、讲一下RAG是什么,你的Agent项目RAG整个工作流整个过程是什么20、学校是在青岛哪个区21、反问:面试评价怎么样22、反问:有三面吗23、反问:部门业务
点赞 评论 收藏
分享
评论
5
18
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务