循环引用警告怎么处理,表格中出现循环引用怎么取消

基于Springframework的应用开发,尤其在系统比较复杂时,可能会出现Bean循环引用的情形。本文分享一下如何解决这类问题。正常引用依赖关系:BeanA→BeanB→BeanC循环引用依赖关系

基于 Springframework 的应用开发,尤其在系统比较复杂时,可能会出现 Bean 循环引用的情形。本文分享一下如何解决这类问题。

正常引用依赖关系:

Bean A → Bean B → Bean C

循环引用依赖关系:

Bean A → Bean B → Bean A

循环引用警告怎么处理

我们知道 Spring 应用在启动时,即会创建 Spring context,加载并实例化 Bean。 正常引用依赖关系中,Spring 尝试实例化 A,发现其依赖 B,则会尝试实例化 B,又发现其依赖 C,则会尝试实例化 C。最终 Spring 会依次创建 bean C,B,A。 而循环引用依赖关系中,Spring 尝试实例化 A,发现其依赖 B,则会尝试实例化 B,又发现其依赖 A,则会尝试实例化 A。最终,Spring 无法决定究竟该先实例化 A 还是先实例化 B。

Spring 在遇到循环引用时,会直接抛出 BeanCurrentlyInCreationException 异常,如:

org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name &39;: Requested bean is currently in creation: Is there an unresolvable circular reference?

来看一个使用使用构造器注入引发循环引用的例子:

表格中出现循环引用怎么取消,@Componentpublic class BeanOne {private final BeanTwo beanTwo;public BeanOne(BeanTwo beanTwo) {this.beanTwo = beanTwo;}}@Componentpublic class BeanTwo {private final BeanOne beanOne;public BeanTwo(BeanOne beanOne) {this.beanOne = beanOne;}}

BeanOne 和 BeanTwo 相互依赖。

解决循环引用,有多种方法:

使用 Field/Setter 注入

使用 @PostConstruct 注解

1、首先出现循环引用的警告,这种情况需要设置excel启用“迭代计算”,也就是允许使用循环引用。2、接着需要找到“excel选项”,如下图所示:3、其次点击“公式”选项,在“计算选项”中,可以看到“启用迭代计算”前面是没有。

使用 @Lazy 注解

使用 Field/Setter 注入解决循环引用问题

01 首先,我们打开我们电脑上面的excel,然后我们点击文件;02 弹出的界面,我们点击选项;

@Componentpublic class BeanOne {@Autowiredprivate BeanTwo beanTwo;}@Componentpublic class BeanTwo {@Autowiredprivate BeanOne beanOne;}

5、将“启用迭代计算”前面的方框勾选上,然后点击确定 ,这样循环引用的警告的提醒就取消了。

类似的,使用 Setter 注入:

@Componentpublic class BeanOne {private BeanTwo beanTwo;@Autowiredpublic void setBeanTwo(BeanTwo beanTwo) {this.beanTwo = beanTwo;}}@Componentpublic class BeanTwo {private BeanOne beanOne;@Autowiredpublic void setBeanOne(BeanOne beanOne) {this.beanOne = beanOne;}}

这两种方式解决思路是一致的,使用默认的无参构造器实例化 bean,此时无需保证其依赖的 bean 已被实例化。Field 注入本质上和 Setter 注入是一样的。

使用 @PostConstruct 注解

修改示例代码如下:

@Componentpublic class BeanOne {private final BeanTwo beanTwo;public BeanOne(BeanTwo beanTwo) {this.beanTwo = beanTwo;}@PostConstructpublic void init() {beanTwo.setBeanOne(this);}}@Componentpublic class BeanTwo {private BeanOne beanOne;public void setBeanOne(BeanOne beanOne) {this.beanOne = beanOne;}}

1,首先,打开Excel软件之后,在窗口上方的选项卡菜单中点击“公式”选项卡。2,在公式选项卡下,找到“错误检查”一项,点击右侧的箭头图标,打开菜单。3,点击之后,会弹出菜单,在弹出的菜单中依次选择“循环引用”-“单元。

The PostConstruct annotation is used on a method that needs to be executed after dependency injection is done to perform any initialization...

使用 @PostConstruct 标注的方法,会在依赖注入之后执行,用于某些初始化操作。在这里,这所谓的“初始化”操作,就是为 beanTwo 的 beanOne 属性赋值。

使用 @Lazy 注解

修改代码如下:

@Componentpublic class BeanOne {private final BeanTwo beanTwo;public BeanOne(BeanTwo beanTwo) {this.beanTwo = beanTwo;}}@Componentpublic class BeanTwo {private final BeanOne beanOne;@Lazypublic BeanTwo(BeanOne beanOne) {this.beanOne = beanOne;}}

1.打开一个Excel文件。打开之后,在操作表中的单元格时,出现了循环引用警告。2.点击左上角的 文件 菜单 ,在出现的菜单中点击 选项 。3.然后点击选项。4.然后在打开的页面中点击左侧的 公式 选项。5.在打开的页面中将。

注意到,修改后的代码,与一开始的引发循环引用异常的代码几乎完全相同,差异仅在于 BeanTwo 构造方法上面的 @Lazy 注解。顾名思义,该注解表明这个构造注入懒执行。

查看其源码注释:

Indicates whether a bean is to be lazily initialized.

查看其源码:

@Target({ElementType.TYPE,ElementType.METHOD,ElementType.CONSTRUCTOR,ElementType.PARAMETER,ElementType.FIELD})

可见 @Lazy 注解,标示一个 Bean 是否被懒初始化。该注解可用于 类型、方法、构造器、参数、字段等目标,在本例中,用在构造器上,表示只有需要用到该类实例时才进行调用该构造器进行实例化操作。所以在该实例中,可能的实例化过程如下: 分析过程:

Start: 尝试实例化 beanOne → 发现需要依赖 beanTwo → 尝试实例化 beanTwo Start: 尝试实例化 beanTwo → 发现 @Lazy 注解,暂不实例化;

实例化过程:

02 要取消循环引用,我们先把警告对话框关闭;鼠标再点击:文件 03 在弹出的页面中再点:选项;转到excel选项界面,在这里,点击;公式 04 如图所示,勾

实例化 beanTwo → 实例化 beanOne

简言之,使用 @Lazy 标注的类,不会在容器中主动触发实例化,只有当被使用到/被依赖到时,被动触发实例化。

“做程序员,圈子和学习最重要”因为有有了圈子可以让你少走弯路,扩宽人脉,扩展思路,学习他人的一些经验及学习方法!同时在这分享一下是一直以来整理的Java后端进阶笔记文档和学习资料免费分享给大家!需要资料的朋友私信我扣【06】

上一篇 2023年02月12 22:55
下一篇 2023年03月02 05:09

相关推荐

  • 男性hpv检查多少钱,男查hpv医生说无意义

    男性检测生殖器是否感染HPV病毒的金标准是什么,最准确的检测方法是什么?检测男性生殖器是否感染HPV病毒的方式通常有三种:男查hpv医生说无意义,第一,通过基因分型定量检测判断病情。医生进行检查的时候

    2023年03月12 271
  • 九价hpv多少钱,一个女孩打九价意味着什么

    接种提醒接种HPV疫苗并不能100%预防宫颈癌妇科专家提醒称,HPV疫苗并不能100%预防宫颈癌,即便接种过疫苗后,一个女孩打九价意味着什么,还要定期进行宫颈癌筛查。安全的性行为和健康的生活方式对于疾

    2023年03月13 248
  • 反应慢怎么办,大脑迟钝反应慢怎么改善

    相信大家都有这样的经历,电脑用久了变得又卡又慢怎么办?下面教你学会这6个操作,大脑迟钝反应慢怎么改善,瞬间提升电脑速度,一起来看看吧。01.结束程序进程内存、CPU占用过高,就会导致的电脑卡顿,按下快

    2023年02月09 261
  • 种植一颗牙大概需要多少钱,前牙掉了

    收费名目的透明化,挤掉了因获客竞争等市场行为带来的价格泡沫。带量采购破解“种牙贵”北京大学口腔医学院种一颗牙的起步价为1.7万元;中日友好医院大概为1.1万元起步;瑞典、瑞士、韩国等进口牙9000-1

    2023年03月08 244
  • 假体隆鼻费用是多少,膨体假体隆鼻多少费用多少钱

    隆鼻大概需要8000元到90000元左右。隆鼻手术的费用不太确定,要根据隆鼻的材质来决定,如果利用硅胶材质,膨体假体隆鼻多少费用多少钱,费用相对要便宜,大概需要8000元左右做自体肋骨填充鼻子,费用相

    2023年03月04 253
  • 植发一般需要多少钱,植发三年真实感受

    脱发后究竟应该怎么治,用药治疗便宜,但是起效慢,植发三年真实感受,时间久,可是医学养护、植发价格又比较贵,荷包伤不起怎么办,治疗脱发到底要怎么分配预算呢?首先,医学养护、植发贵在哪里,和用药治疗有什么

    2023年03月04 230
  • 怎样办残疾证,初次办残疾证需要什么手续

    【来源:赤水市人民政府_便民】一、残疾人证新办1.申请初次办残疾证需要什么手续,未持有残疾人证的申请人,可直接到居住地县级残联或户籍地县级政务服务中心残疾人事务服务窗口申请办理,也可通过全国残联信息化

    2023年01月02 264
  • 拔牙肿胀怎样消肿最快,拔牙第2天脸更加肿了

    想问问各位小伙伴,大家在拔完智齿后都有过「脸肿」的体验吗?昨晚,演员周冬雨就在社交平台上晒出了拔完智齿后脸巨肿的经历。来,一起感受一下~第二种方法很简单,就是口服消肿药,如塞米松片,或者打消炎针,很快

    2022年12月31 295
  • 怎样针灸

    中风,又被称作脑卒中,是危害我国中老年人群健康和生活质量的重要疾病,其发病率、复发率、致残率及死亡率一直居高不下。脑卒中在世界范围内60岁及以上人群死因中居第2位,15-59岁人群死因中居第5位。近年

    2023年01月01 242
  • 怎样催眠别人,怎么用催眠术控制别人

    首先要这里说的“催眠”,是要设法避开对方的意识,把你的建议直接送入他的大脑,使他更容易接受。之所以要避开意识,是因为意识就像一个严格的守卫,会阻挡掉很多和本人的价值观不符,怎么用催眠术控制别人,或者很

    2023年01月01 264
  • 肛瘘是怎么引起的,男性肛瘘初期图片大全

    肛瘘是肛门直肠瘘的简称,是发生在肛门直肠周围的脓肿破溃或局部感染以后的一些相关疾病。肛瘘在肛瘘的分类上,根据部位的不同,在齿状线以上称之为高位肛瘘,在齿状线以下称之为低位肛瘘。形成原因如下:1、细菌感

    2023年01月12 272
  • 住院报销多少,三甲住院10000可以报销多少

    “我买的药明明是进医保的,为什么我今天在药店买的时候得自己付全额?”“我是退休人员,三甲住院10000可以报销多少,最近住院治疗花费了1万多元,自己付了2千多,医保是怎么报销的?”……杭州医保每天都会

    2023年02月24 212
  • 阴倒镜检查结果怎样看,妇科炎症自测对照表图片

    妇科筛查中,如何确定阴道镜结果异常?通过在子宫颈表面涂冰醋酸和复方碘溶液,能够帮助发现子宫颈是否正常。阴道镜检查结果判断1、正常宫颈阴道部鳞状上皮阴道镜显示上皮光滑呈粉红色。涂3%醋酸后上皮不变色。碘

    2023年01月05 277
关注微信