对于springboot项目中出现的循环依赖问题

前言

开始写这篇笔记时间是 23/7/28 0:38 ,因为要改改样式,所以明日再补全全文,睡觉~

深夜发稿不是因为多爱创作,实在是这个玩意太折磨人了~_~ 因此记录下来,也希望能给某个深夜正在挠头皮的你一点帮助,愿你秀发如新

正文

现象

springboot的依赖注入十分好用,又因为平常小项目很少遇到循环依赖这一难题,故而相信各位闭着眼睛就是 @Autowired ,然后就是 run ,直接跑通!这无疑是极爽的,我也是这样哈哈哈。

但是在相对复杂而拥有一大堆需要一股脑丢给spring去注入IoC的依赖的时候,这时你就要痛苦了

因为你搞不清楚类注入Ioc的顺序,而当你的一个类中需要注入另一个类,而需要被注入的第二个类此时还没有注入Ioc,那么这个类构建就失败了。

常见异常抛出

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error create bean xxxx ...

这就是依赖循环

概念

什么是循环依赖?

循环依赖是指两个或多个 bean 彼此之间相互引用,形成了一个循环链,导致 Spring 无法正确地完成依赖注入。

解决方法

要解决这个问题,你可以尝试以下几种方法:

  1. 通过使用 @Lazy 注解延迟初始化 bean,可以解决部分循环依赖的问题。在 bean 上添加 @Lazy 注解,例如:@Lazy(true)

  2. 检查代码中是否存在循环依赖的问题。可能是由于两个或多个 bean 之间的相互引用导致循环依赖。尝试重新设计你的 bean 之间的依赖关系,避免循环依赖的发生。

  3. 如果使用了构造函数注入,请尝试改为使用 setter 方法注入。有时候,构造函数注入会导致循环依赖的问题,而使用 setter 方法注入可以避免这个问题

  4. 使用 @Autowired 注解时,尽量明确指定要注入的 bean 名称,而不是依赖类型例如,使用 @Autowired 注解时,可以通过 'userDetailsService' 的名称指定要注入的 bean,如:@Autowired @Qualifier("userDetailsService")

@Lazy:懒惰加载,即当使用到该类时才会被加载。有需要时,可以搭配此注解妥善解决循环依赖问题

例子

下面通过两个例子介绍 Setter 方法注入和 构造方法注入的方式:

  • 对于构造函数注入,可以使用 @Autowired 注解。你可以将 @Autowired 注解放置在构造函数上,告诉 Spring 使用自动装配的方式来完成依赖注入。示例代码如下:
public class MyClass {
    private Dependency dependency;

    @Autowired
    public MyClass(Dependency dependency) {
        this.dependency = dependency;
    }
}
  • 对于 Setter 方法注入,可以使用 @Autowired 注解或 @Resource 注解。两者都可以用于标注依赖的 Setter 方法,以指示 Spring 容器进行自动装配。示例代码如下:
//使用@Autowired
public class MyClass {
    private Dependency dependency;

    @Autowired
    public void setDependency(Dependency dependency) {
        this.dependency = dependency;
    }
}

//使用@Resource
public class MyClass {
    private Dependency dependency;

    @Resource
    public void setDependency(Dependency dependency) {
        this.dependency = dependency;
    }
}

在以上示例中,Dependency 是需要注入的依赖对象,确保在配置文件上或者在其类上用@Component 或者其他注解将其转换为 Spring Bean(受 Spring 管理的 Bean)

使用@Autowired注解时,是按类型进行依赖注入的;使用@Resource注解时,是按名称进行依赖注入的。所以当你的项目中有多个相同类型的依赖需要注入,且希望按名称注入,可以配合使用 @Reource(name) 或者 @Qualified(name) 注解

拓展

另外的,多模块下的项目也很容易发生循环依赖。例如你的项目下有A, B, C三个模块,其中依赖关系为:

A --> B --> C --> A  //箭头代指 “依赖于”

那么在构建项目时便会报错了。这就需要各位在搭建项目架构时妥善分配好每个模块的职责,并设计好它们的依赖关系,防止在项目逐渐完善时出错,这将会是你不想面对的 —— 你可能将需要重新搭建项目结构!

结尾

这个难题是我在独立开发项目时碰到的,索性写成文章发表出来,希望能帮助到正在学习的你。

另外的,这篇笔记是有众多不足之处的,路过的大佬请多指教,不对的地方也烦请指正,一起学习!

下图是我目前个人项目开发项目的模块架构,其基本功能仍不完整,但孩子能力有限,只能一步步慢慢做。后期 version1 开发出来会开源,希望各位多多star,欢迎大佬的指点!

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值