Spring:init-method,PostConstruct,afterPropertiesSet:何时使用其他人?

时间:2014-08-27 13:41:18

标签: java spring

Spring bean生命周期中有许多初始化选项。

init-method PostConstruct 注释, afterPropertiesSet ,Bean 后期初始化甚至是类构造即可。所有这些都可以用于初始化bean。

我很困惑何时使用其中一个。此外,有没有我们可能需要在一个Bean中使用所有这些选项?如果是,请举例说明。

真的很期待得到一些很好的答案。

3 个答案:

答案 0 :(得分:17)

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

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

除此之外,我没有看到差别,除了执行顺序。我不认为有一种情况你想要在同一个班级中拥有所有选项。

答案 1 :(得分:7)

我建议您尽可能使用构造函数。有一个非常好的理由:测试

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

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

答案 2 :(得分:0)

我个人在XML配置中仅使用init-method来进行模拟/单元测试。在许多情况下,我发现自己需要在bean中进行测试以使用不同的逻辑或不同的属性值(即模拟数据)。此外,模拟数据将经常根据测试用例而变化。在这些情况下,我发现拥有多个与案例相关的版本的配置要干净得多。这样,可以将它们换出而不必更改类内部的任何内容。这不是从一开始就进行依赖注入的主要目的吗?

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