Spring 3+如何使用相互使用的autowire bean?

时间:2012-12-06 07:44:29

标签: java spring autowired

例如,我有

@Service
public class UserSerice {
  @Autowired
  private HouseService houseService;
}

@Service
public class HouseService {
  @Autowired
  private UserSerice userService;
}

Spring将如何自动启动? 以这种方式配置bean是一种很好的做法吗?

4 个答案:

答案 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