事件起因
今天在做一个新项目,分布式项目,引入了一个第三方项目,然后在根目录的pom.xml文件中引入了第三方项目module,启动的时候报错了:
***************************
APPLICATION FAILED TO START
***************************
Description:
The dependencies of some of the beans in the application context form a cycle:
┌──->──┐
| com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration
└──<-──┘
Action:
Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.
问题分析
看这个信息提示好像很简单的问题,就是出现了循环依赖,但是也是要区分的,这里很明显是springboot集成管理分页组件件出现循环依赖的问题,我这里spring-boot-starter-parent
用的是2.6.5版本,而在集成分页组件依赖pagehelper-spring-boot-starter
的版本是1.2.5版本,找到问题就很好解决了。
解决方案
把pagehelper-spring-boot-starter
的版本升一下就好了,我直接升到最新版本1.4.1,问题解决;
其他情况
当然也存在其他情况的循环依赖:
类A需要通过构造函数注入的类B的实例(或者B中声明的Bean),而类B需要通过构造函数注入的类A的实例(或者A中声明的Bean)。如果将类A和类B的bean配置为相互注入,则Spring IoC容器会在运行时检测到此循环引用,并引发一个BeanCurrentlyInCreationException。与典型情况(没有循环依赖)不同,bean A和bean B之间的循环依赖关系迫使其中一个bean在被完全初始化之前被注入到另一个bean中。Spring无法判断哪个先哪个后,这个时候就可以使用以下方案解决
1.不使用基于构造函数的依赖注入
2.在字段上使用@Autowired
注解,让Spring决定在合适的时机注入。【推荐
】
3.用基于setter方法的依赖注射取代基于构造函数的依赖注入来解决循环依赖。
4.在@Autowired注解上方加上@Lazy
注解(延迟加载
)
参照: 其他情况解决方案.