Spring自动注入循环依赖分析解决

目录

目录

一、什么是循环依赖呢?

二、Spring 的循环依赖

三、举个栗子

四、解决办法

4.1 重新设计

4.2 使用 setter/field 方法注入

4.3 使用 @Lazy

4.4 使用 @PostConstruct

4.5 实现ApplicationContextAware and InitializingBean接口

五、总结


一、什么是循环依赖呢?

类A依赖类B,类B也依赖类A,这种情况就会出现循环依赖。

Bean A → Bean B → Bean A

上面是比较容易发现的循环依赖,也有更深层次的循环依赖。

Bean A → Bean B → Bean C → Bean D → Bean E → Bean A

二、Spring 的循环依赖

当Spring上下文在加载所有的bean时,会尝试按照他们他们关联关系的顺序进行创建。如果不存在循环依赖时,例如:

Bean A → Bean B → Bean C

Spring会先创建Bean C,再创建Bean B(并将Bean C注入到Bean B中),最后再创建Bean A(并将Bean B注入到Bean A中)。

但是,如果我们存在循环依赖,Spring上下文不知道应该先创建哪个Bean,因为它们依赖于彼此。在这种情况下,Spring会在加载上下文时,抛出一个BeanCurrentlyInCreationException。

当我们使用构造方法进行注入时,会遇到这种情况。因为它是上下文加载就被要求注入。


 

三、举个栗子

用户类需要调用组织类中的方法,于是通过构造方法注入组织类。

@Service

public class UserService {


private final DishService dishSerivce;


/**

* 通过构造方法注入DishService 类

*/

@Autowired

public UserSerivce(DishService dishSerivce) {

this.dishSerivce= dishSerivce;

}


public List<Dish> list() {

retern dishSerivce.list();

}


}

 而组织类也刚好需要调用用户类里的方法,于是它也通过构造方法注入用户类。

@Service

public class DishService {


private final UserService userSerivce;


/**

* 通过构造方法注入UserService类

*/

@Autowired

public DepartmentSerivce(UserService userSerivce) {

this.userSerivce = userSerivce;

}


}

​​​​​这种情况程序在编译时,就会报下面的错误

Description:


The dependencies of some of the beans in the application context form a cycle:


┌─────┐

| userService defined in file [D:\Java\IdeaProjects\UserService.class]

↑ ↓

| depart
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值