栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring 循环依赖

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring 循环依赖

在Spring Bean 的生命周期中,里面有一步就是填充属性。而填充属性之前会判 属性对象是否被当前对象循环依赖,当发现属性对象被循环依赖的时候会进行aop并且生成属性对象的代理对象。

循环依赖是如何形成的

当 对象UserA 实例化完成,进行填充属性UserB 的时候 ,先去单例池里面去获取 UserB 对象,初次没有获取到,开始实例化UserB ,当UserB 实例化完成,进行填充属性UserA 的时候,先去单例池里面去获取 UserA 对象,初次没有获取到,再去实例化UserA ,并进行填充属性UserB,此时造成死循环。

单例池 存放的是经过完成生命周期的对象即最终的产出的SpringBean。

如何解决循环依赖
我们先回顾一下Spring Bean生命周期的大致步骤 ,如下图

如何解决呢
1.添加一个缓存MapA,如图所示

当实例化UserA 的时候 先将实例化好的UserA 对象放到 MapA 中,再来填充它的UserB 属性,单例池里面没有,去实例化UserB ,并将实例化好的UserB 对象放到 MapA 中,再来填充 UserB对象的 UserA属性,单例池里面没有,去缓存 MapA 里面获取并且获取到了,直接给属性UserA 赋值,UserB 创建完成,将UserB放入单例池,再将 UserA对象 的 UserB 属性赋值,再完成UserA 的创建,最后将UserA 放入单例池。

但是根据上面的生命周期而言,循环依赖赋值的属性对象值并不是最终的那个Spring Bean ,只是一个实例对象。

就是说这个缓存里面放的并不是最终的对象(虽然内存里面都是同一份地址,但是这个对象可能被AOP表达式命中的对象呢)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/343498.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号