個人理解,有問題歡迎指正。
????????Spring 生命周期中,首先使用構造方法對 bean 實例化,實例化完成之后才將不完全的 bean放入三級緩存中提前暴露出 bean,然后進行屬性賦值,此時容易出現循環依賴問題。
由此可見,Spring 使用三級緩存能夠解決循環依賴的場景有:
1.屬性賦值-屬性賦值
2.先屬性賦值-后構造方法
但是以下場景中,由于在構造方法中進行屬性注入,此時 beanA 還未被實例化,三個級別的緩存中都不存在該 beanA,此時屬性注入過程中創建屬性 beanB時找不到循環依賴的bean A,因此而報錯。
1.先構造方法-后構造方法
2.先構造方法-后屬性復制
例如:
@Service
@AllArgsConstructor
public class CommentServiceImpl{@Resourceprivate IUserService userService;
}@Slf4j
@Service
public class UserServiceImpl{@Resourceprivate IAsyncUserInfoService asyncUserInfoService;
}@Service
public class AsyncUserInfoService{@Resourceprivate ICommentService commentService;
}
解決方法推薦編碼解決,也可在其中任意循環節點 bean 注入上加@Lazy 懶加載注解解決,原理是在有@Lazy 注解時,spring容器啟動時不創建該bean,而是使用到的時候創建。
?