例如,我有
@Service
public class UserSerice {
@Autowired
private HouseService houseService;
}
和
@Service
public class HouseService {
@Autowired
private UserSerice userService;
}
Spring将如何自动启动? 以这种方式配置bean是一种很好的做法吗?
答案 0 :(得分:3)
Circular dependencies (spring-framework-reference):
例如:A类需要B类的实例 构造函数注入,而类B需要类A的实例 通过构造函数注入...抛出一个 BeanCurrentlyInCreationException。
不推荐。 .. 一种可能的解决方案是编辑某些类的源代码 由setter而不是构造函数配置......
PLUS:
我以setter方式调试了循环依赖项。 序列似乎是:
- >开始创建bean A
- >开始创建bean B
- >将 A 注入 B ,尽管从Spring生命周期的角度来看, A 并未完全创建
- > Bean B 创建完成
- >将bean B 注入 A
- > Bean A 已创建
答案 1 :(得分:2)
由于它不是构造函数注入,因此spring可以安全地实例化两个对象,然后满足它们的依赖关系。在架构方面,这种情况被称为“代码嗅觉”。这是组成中出现问题的标志。也许你需要移动逻辑,也许你需要引入第三类,这取决于。
答案 2 :(得分:1)
谷歌的这些条款
Flyweight模式
java中的循环依赖
就像2个java对象可以互相引用一样,拥有这样的配置是完全有效的。
答案 3 :(得分:0)
保持冷静并使用@Lazy
您可以使用@Lazy annotation() 打破循环依赖
@Service
public class UserSerice {
@Autowired
@Lazy
private HouseService houseService;
}
您可以按原样使用 HouseService(没有变化:))
@Service
public class HouseService {
@Autowired
private UserSerice userService;
}
进一步的解决方案:https://www.baeldung.com/circular-dependencies-in-spring#2-use-lazy