Java Spring:init方法,PostConstruct,afterproperties set:何时使用一个方法而不是其他方法?

Java Spring:init方法,PostConstruct,afterproperties set:何时使用一个方法而不是其他方法?,java,spring,Java,Spring,在Springbean生命周期中有很多可用的初始化选项 初始化方法,后构造注释,后属性集,Bean后初始化甚至类构造函数。所有这些都可以用于初始化bean 我不知道什么时候该用一个来代替另一个。此外,我们是否需要在单个Bean中使用所有这些选项?如果是,请举例说明 非常期待得到一些好的答案。我建议您只在可能的情况下使用构造函数。这样做有一个很好的理由:测试 当您要对Springbean进行单元测试时,您希望能够以最小的麻烦构造类。这意味着您只需要调用构造函数,而不必自己处理调用各种生命周期方法。

在Springbean生命周期中有很多可用的初始化选项

初始化方法后构造注释,后属性集,Bean后初始化甚至类构造函数。所有这些都可以用于初始化bean

我不知道什么时候该用一个来代替另一个。此外,我们是否需要在单个Bean中使用所有这些选项?如果是,请举例说明


非常期待得到一些好的答案。

我建议您只在可能的情况下使用构造函数。这样做有一个很好的理由:测试

当您要对Springbean进行单元测试时,您希望能够以最小的麻烦构造类。这意味着您只需要调用构造函数,而不必自己处理调用各种生命周期方法。创建要测试的类时,最不希望看到的是必须知道对象属性是如何初始化的


借助Spring的构造函数注入支持,您可以轻松地将其他bean或项目属性注入到构造函数中,从而能够覆盖几乎所有场景。

使用构造函数和其他选项的区别在于,构造函数代码是第一个执行的,而其他选项将仅在依赖项被注入bean(来自@Autowired注释或XML文件)后调用

在构造函数中编写的代码将在bean的属性尚未启动时运行。所有@Autowired字段都将为空。有时这是您想要的,但通常您希望在设置属性后运行代码


除此之外,我看不出有什么区别,除了执行顺序。我不认为您希望所有选项都在同一个类中。

我个人在xml配置中使用
init方法
,仅用于模拟/单元测试。在许多情况下,我发现自己处于需要在bean中使用不同逻辑或不同属性值(即模拟数据)进行测试的情况。此外,模拟数据通常会根据测试用例而变化。在这些情况下,我发现在一个配置中使用多个依赖于大小写的版本要干净得多。通过这种方式,它们可以被交换出去,而不必更改类本身内部的任何内容。这不是依赖注入的主要目的吗


当通过构造函数初始化bean时,必须将依赖于测试的初始化关注点(例如使用模拟值初始化)写入所述构造函数(或者编写多个构造函数)。通过这样做,您正在将测试逻辑硬编码到类中。避免这种类型的实践是创建Spring等框架的主要原因之一

几乎所有的场景,除了不能使用构造函数注入的情况(即循环依赖)。在这种情况下,初始化bean的唯一方法是
@PostConstruct
及其替代方法。我认为这个[好的]答案意味着使用“构造函数注入”,只是为了澄清一下。。。如果您确实这样做了,那么在同一个类中另外添加任何PostConstruct注释()可能是不明智的。如果仍然如此,@PostConstruct方法将不会在[e.e:]香草JUnit测试中调用,因为那里没有涉及Spring!如果这听起来仍然令人困惑,我深表歉意。我试着编辑它,使它不那么简单。