构造参数注入解决循环依赖问题
虽然Spring可以解决上边通过成员变量注入引发的循环依赖问题,但是通过构造参数注入引发的循环依赖问题是会报错。
如下图:
为什么上图中的循环依赖会报错呢?
因为创建C需要调用构造方法,而构造方法需要依赖D,此时C是无法实例化的,上边分析Spring解决循环依赖是通过延迟初始化,当出现循环依赖问题可以注入一个半成品,而这里连半成品都无法创建成功。
如何解决这种通过构造参数注入导致的循环依赖问题呢?
可以在C或D的任意一方注入另一方的代理对象而不是注入原始对象,如下:
假设在C的构造方法中注入D的代理对象可以写为:
在构造参数前加@Lazy注解,表示注入D的代理对象。
public C(@Lazy D d){
...
}