0

在我们的一个 bean 中,我们正在内存中读取一些基于文件的数据。

从 ApplicationContextListener 执行此操作会更好,例如调用 beans init() 方法,还是仅将 @PostConstruct 添加到此 init() 方法以便容器自动执行此操作?

4

1 回答 1

0

您可以使用:
1. @PostConstruct
2.InitializingBean接口
3.<bean class="your bean class" init-method="your init method"/>

属性:init-method:设置bean属性后要调用的自定义初始化方法的名称。该方法必须没有参数,但可以抛出任何异常。这是实现 Spring 的 InitializingBean 接口或使用 PostConstruct 注释标记方法的替代方法。

它们是替代方案:如果您的程序完全带注释,则使用注释,如果使用 XML,则使用 XML(我不喜欢混合,您无需问自己是否使用 annot 或 xml 实现了功能)

编辑:

  • 上下文监听器:每次上下文刷新都会被调用(通常一次,在启动时)
  • InitializingBean@PostConstruct:每次创建 bean 时都会调用应用到 bean 的生命周期(取决于范围)

在您使用上下文侦听器的情况下:

  1. 调用 init() 一直等到 bean 的 init() 终止,但您确定在容器生命周期的哪个时间调用它。
  2. 你失去了任何惰性初始化的可能性,
  3. 但获得从错误中恢复的可能性(可能接受在内存中没有数据的情况下工作)

InitializingBean你一起:

  1. 关心 bean 的范围是“单例”(否则每次连接 bean 时,都会调用 init() 方法),
  2. 如果发生故障,您失去了恢复的可能性,因为 bean 的初始化周期不在您手中(或者将更难恢复)
  3. 您获得了惰性初始化的可能性(减少了启动时间)

在您的情况下,如果您使用的是没有延迟初始化的单例 bean,并且在发生故障时不需要错误恢复,则根本没有区别

于 2013-08-07T14:27:33.227 回答