一、什么是循环依赖呢?
类A依赖类B,类B也依赖类A,这种情况就会出现循环依赖。
Bean A → Bean B → Bean A
上面是比较容易发现的循环依赖,也有更深层次的循环依赖。
Bean A → Bean B → Bean C → Bean D → Bean E → Bean A
用户类需要调用组织类中的方法,于是通过构造方法注入组织类。
而组织类也刚好需要调用用户类里的方法,于是它也通过构造方法注入用户类。
二、解决办法 简单的三种方法
使用 setter 方法注入
上面说到,只有构造方法是在上下文加载时就要求被注入,容易出现依赖循环。所以可以用其他的方式进行依赖注入,setter 和 field 方法注入与构造方法不同,它们不会在创Bean时就注入依赖,而是在被需要时才注入。
1、setter方法注入
@Service
public class UserService {
private DepartmentService departmentSerivce;
@Autowired
public void setDepartmentSerivce(DepartmentService departmentService) {
this.departmentService = departmentService;
}
public List<Department> list() {
retern departmentService.list();
}
}
2、field方法注入(使用@Autowired)
@Service
public class UserService {
@Autowired
private DepartmentService departmentSerivce;
public List<Department> list() {
retern departmentService.list();
}
}
3、使用 @Lazy
解决Spring 循环依赖的一个简单方法就是对一个Bean使用延时加载。也就是说:这个Bean并没有完全的初始化完,实际上他注入的是一个代理,只有当他首次被使用的时候才会被完全的初始化。
我们对 UserService 进行修改,结果如下:
@Service
public class UserService {
private DepartmentService departmentSerivce;
@Autowired
public UserSerivce(@Lazy DepartmentService departmentService) {
this.departmentService = departmentService;
}
public List<Department> list() {
retern departmentService.list();
}
}