Requested bean is currently in creation: Is there an unresolvable circular reference?

本文记录了解决Spring框架中出现的循环依赖错误的过程。通过分析错误信息及代码结构,作者发现循环依赖出现在特定的Bean上,并提供了两种解决方案:一是将Bean的作用域由多例改为单例;二是更改Bean的注入方式,从构造函数注入改为属性注入。

今天开发写代码,运行代码的时候 出现了 这个错误 : Requested bean is currently in creation: Is there an unresolvable circular reference? 懵逼啊, 什么鬼呢? 百度了一下,说是 循环引用了。 看了一下,还是有点狠难理解。 参考地址: http://zhujie.3.blog.163.com/blog/static/276015242011730104636246/ 说什么,单例的不会出现这样的问题的。 看了 一下代码 :

@Service
@Scope("prototype")

果然是 注解了 多例,公司框架,之前 只管用,还没有注意到 是加了 多例的, 一般不是 单例的 。 好吧。 可还是一脸的不理解啊: 继续看百度的, 一般都是 说 , a-b-c-a 总之就算 注解的时候 循环 注解了。 构造 bean 的时候 出现 循环了,可 从代码里面怎么看 ? 好吧,有点理解了,可是怎么 知道 是 哪里 出现了问题呢。

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hrEffPfmcePlaneecptDomain': 
	。。。
	
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'toDoStDomain':
	。。。
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepositoryImpl':
	。。。





	
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hrEffUserInfoDomain': 
	。。。
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hrEffLeaderDomain': 
	
	
	
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'hrEffPfmcePlaneecptDomain': Requested bean is currently in creation: Is there an unresolvable circular reference?
	
	
	

上面是我的代码 。抛出来的错误,直接看 错误代码 抛出来的, 这样 引用之间还是 先挺长的 ,总之 就是 : ---'hrEffPfmcePlaneecptDomain.....---toDoStDomain...--hrEffPfmcePlaneecptDomain... 这两个实体 循环引用了。 得解决。 解决办法, 说什么 变 单例啊 , 用set 的 原生方式, 加入 bean 的引用,替换注解 参考地址: http://blog.youkuaiyun.com/chengxu2011/article/details/8478290

我觉得 最差的解决: 就是 如果 可以 换注解,就 在 这两个 bean 里面。 修改 方法, 不互相引用即可。 我的解决办法:

@Service
// @Scope("prototype") 这个Domain 引用太多了,必须变 单例, 否则 容易 出现 循环注入引用的问题

在关键的 domain 类里面, 去掉 多例,默认就是 单例了。即可解决问题

那么问题来了, 单例 和多例有什么区别? 这样 改动真的没有问题? 参考地址: https://www.oschina.net/question/1379473_167167 controller 必须是 单例, 这样可以 保证 线程的安全行。 其他的bean 如果是 多例, 可以保证 线程安全性 ,不会 使用到其他 线程的 修改实体 后的 值的, 但是 单例的性能 就比较好, 速度比较快。 因此 ,推荐使用 spring通过对每个request进行threadlocal封装保证每个request都是独立的线程,这样来做线程安全。 大神说的, 这样就是 用 空间来 换取 。。。

存在 循环依赖问题, 还有一种情况就是 bean 的引用 注入的时候, 使用的是 构造函数注入 bean 的方式。 将 注入的方式 换成 属性注入 即可。 循环引用 的方式还可以 产生在 类的 构造函数里面, 比如 类A ,和 类B , 类A 构造函数 引用到 类B 。 而 类B的构造函数 引用到 类A ,这样的情况也是循环引用了, 也是不可以的。

转载于:https://my.oschina.net/u/2419285/blog/861801

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值