目录
目录
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