Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring3&x2B;autowire bean,它们互相使用?_Java_Spring_Autowired - Fatal编程技术网

Java Spring3&x2B;autowire bean,它们互相使用?

Java Spring3&x2B;autowire bean,它们互相使用?,java,spring,autowired,Java,Spring,Autowired,例如,我有 @Service public class UserSerice { @Autowired private HouseService houseService; } 及 Spring将如何自动连线? 这样配置bean是一种好的做法吗?谷歌搜索这些术语 飞锤图案 java中的循环依赖 就像两个java对象可以相互引用一样,拥有这样的配置是完全有效的。因为它不是构造函数注入,spring可以安全地实例化这两个对象,然后满足它们的依赖关系。在架构方面,这种情况被称为“代码气味”。

例如,我有

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

Spring将如何自动连线?
这样配置bean是一种好的做法吗?

谷歌搜索这些术语

飞锤图案

java中的循环依赖


就像两个java对象可以相互引用一样,拥有这样的配置是完全有效的。

因为它不是构造函数注入,spring可以安全地实例化这两个对象,然后满足它们的依赖关系。在架构方面,这种情况被称为“代码气味”。这是作文有问题的迹象。也许你需要移动逻辑,也许你需要引入第三类,这要看情况而定。

例如:类A需要通过 构造函数注入,类B需要类A的实例 通过构造函数注入…抛出一个 BeanCurrentlyIncremationException

不建议使用。。 一种可能的解决方案是编辑某些类的源代码 由setter而不是构造函数配置

加上:

我以setter方式调试了循环依赖项。序列似乎是:

->开始创建bean

->开始创建bean B

->将A注入B,尽管从Spring生命周期的角度来看,A并不是完全创建的

->Bean B创建完成

->将bean B注入A

->豆子

保持冷静,使用@Lazy

可以使用@Lazy注释()打破循环依赖关系

您可以按原样使用客房服务(无更改:)


进一步的解决方案:

hmm。。但如果我没弄错的话,我不会使用构造函数注入。我使用@Autowiredannotation@omickron我添加了bean创建序列。所以,这样就没有BeanCurrentlyIncremationException了,是吗?不,它是setter,不是构造函数。谢谢!因为哪个版本的Spring@Autowired不是构造函数注入?@omickron从一开始:)当Autowired应用于字段或访问器方法时,它是setter注入,并在实例化后执行。当构造函数被标记为自动连线时,它就是构造函数注入。至于我,我更喜欢picocontainer方式,当构造函数自动连接是按类型自动完成的,实际上没有任何注释,尽管它在spring World中不太常见。谢谢,@xeye,我太年轻了,你帮助我理解了spring注入是如何工作的。我很感激。
@Service
public class HouseService {
  @Autowired
  private UserSerice userService;
}
@Service
public class UserSerice {
  @Autowired
  @Lazy
  private HouseService houseService;
}
@Service
public class HouseService {
  @Autowired
  private UserSerice userService;
}