@RequiredArgsConstructor 引发的循环依赖问题

一:背景

在启动一个公司老的项目中,发现这个项目的代码出现循环依赖且是偶发的,其中注入bean的方式多采用属性注入和@RequiredArgsConstructor(lombok提供的注入方式)

二:问题

1.出现循环依赖场景
都采用@RequiredArgsConstructor
@RequiredArgsConstructor 引发的循环依赖问题_第1张图片
结论:这里出现A和B相互依赖的场景,因为是采用@RequiredArgsConstructor,会给private final修饰的类自动生成构造器注入,而spring解决不了构造器注入的循环依赖场景,所以发生循环依赖

2.不一定会出现循环依赖场景

@RequiredArgsConstructor 和 属性注入 一起用

1.启动不了
@RequiredArgsConstructor 引发的循环依赖问题_第2张图片

2.启动成功
@RequiredArgsConstructor 引发的循环依赖问题_第3张图片

1场景下:先用构造方法创建A,发现需要B,B为空,构造方法创建A失败,直接报错循环依赖

2场景下:先用属性注入B,B找不到,会继续去创建A,走A的构造时,发现需要B,但是B这时候已经通过自己的无参构造去创建了,因为A可以创建成功,B也就成功了

结论,成功与否,还是取决于注入方式

三:结论

1.@RequiredArgsConstructor 慎用,除非项目中不允许出现循环依赖的场景
1.@RequiredArgsConstructor 和属性注入不要混着用,容易导致循环依赖的发生

你可能感兴趣的:(Spring,spring)