网站首页 > java教程 正文
项目启动时候失败,有时候经常看到这样的错误信息:
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException:
Error creating bean with name 'liveRoomServiceImpl': Bean with name 'liveRoomServiceImpl'
has been injected into other beans [rongCouldMsgService] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching -
consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.
出现类似的情况,说明就是循环依赖所导致的了。
常见的会导致循环依赖出现的编程方式
项目中常见的就是service层那一块会出现错误的引用方式导致出现循环依赖:
项目中存在bean自己引用自己的情况
@Service
public class TestServiceImpl implements TestService {
Logger logger = LoggerFactory.getLogger(TestServiceImpl.class);
@Autowired
TestService testService;
@0verride
@Async
public void test(){
System. out.println(1122) ;
}
}
项目serviceA引用serviceB,serviceB中有引用serviceA的情况
@Service
public class LiveAttentionServiceImpl extends BaseService implements LiveAttentionService {
@Autowired
private LivePanelService livePanelService;
}
public class LivePanelServiceImpl implements LivePanelService {
@Autowired
private LiveAttentionService liveAttentionService;
}
以上这两种写法都会导致循环依赖的问题,最终导致在项目中启动时候出现如上错误信息。
解决方案
Spring循环引用报错,目前没有很好的解决方案
in its raw version as part of a circular reference, but has eventually been wrapped.
循环依赖Spring是解决的,得益于spring的内部机制,让我们根本无法感知它有问题,因为spring默默帮我们解决了,使用的是内部有三级缓存:
- singletonObjects 一级缓存,用于保存实例化、注入、初始化完成的bean实例
- earlySingletonObjects 二级缓存,用于保存实例化完成的bean实例singletonFactories
- 三级缓存,用于保存bean创建工厂,以便于后面扩展有机会创建代理对象。
但是为什么还会出现呢?可能是循环依赖写法导致Spring三级缓存也没法注入正确导致。有如何解决方案。
1. 使用@Lazy注解,延迟加载进行解决
@Lazy注解的功能是,在Spring 在启动的时候延迟加载这个bean,然后在他即调用这个bean的时候再去初始化,这样就避免了Spring循环引用的异常。
2. 避免这种写法
业务中非得使用ServiceA注入ServiceB,ServiceB中注入ServiceA的业务场景,则抽取出来一个ServiceAB类,在ServiceAB中注入ServiceA和ServiceB
3. 使用SpringUtils工具类获取实例化循环依赖的Bean
和@Lazy有异曲同工之处
循环依赖原因
猜你喜欢
- 2025-04-08 图解 Spring 循环依赖,看过之后再也不怕面试被问到了
- 2025-04-08 JAVA中for循环优化的思考(java中for循环的原理)
- 2025-04-08 Java 魔法类 Unsafe 详解(java魔数)
- 2025-04-08 Java循环:for、foreach与stream性能对比
- 2025-04-08 Java for循环(Javafor循环的三种写法)
- 2025-04-08 【200915】编程入门第五课,循环语句
- 2025-04-08 java不得不说的秘密-Java中goto跳转执行代码的秘密
- 2025-04-08 为什么阿里强制要求不要在foreach循环里进行元素remove和add操作
- 2025-04-08 Java线上CPU飙高排查:从定位到优化的全链路实战
- 2025-04-08 java里的for循环(java循环结构之for循环)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)