近段时间在写项目的时候,无意间启动项目出现以下错误:
This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example
通过翻译这个错误提示是指 项目中存在循环依赖,在对应ServiceImpl实现类里面的确发现有相互引用对应的Service。
首先说一下什么是依赖循环,比如:我现在有一个ServiceA需要调用ServiceB的方法,那么ServiceA就依赖于ServiceB,那在ServiceB中再调用ServiceA的方法,就形成了循环依赖。Spring在初始化bean的时候就不知道先初始化哪个bean就会报错。
那如何解决循环依赖,当然最好的方法是重构你的代码,进行解耦,但是重构不是一时的事情,那就使用下面的方法:
public class ClassA {
@Autowired
ClassB classB;
}
public class ClassB {
@Autowired
ClassA classA ;
}
在你注入bean时,在互相依赖的两个bean上加上@Lazy注解也可以。
以上两种方法都能延迟互相依赖的其中一个bean的加载,从而解决循环依赖的问题。