使用ApplicationContextListener或@PostConstruct

时间:2013-08-07 14:18:29

标签: spring

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

从ApplicationContextListener执行此操作会更好吗调用bean的init()方法,或者只是将@PostConstruct添加到这个init()方法中,这样容器会自动执行吗?

1 个答案:

答案 0 :(得分: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的特性)< / p>

编辑:

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

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

  1. 调用init()等到bean的init()终止,但你是 确定它被称为容器生命周期的哪个时间。
  2. 你失去了任何懒惰的可能性,
  3. 但有可能从错误中恢复(可能接受工作 没有内存中的数据)
  4. InitializingBean你:

    1. 有关心bean'范围是“singleton”(否则每次连接bean时都会调用init()方法),
    2. 在失败的情况下你失去了恢复的可能性,因为bean的初始化周期不在您手中(或者更难以恢复)
    3. 你获得lazy-init的可能性(启动时间缩短)
    4. 在您的情况下,如果您使用的是没有lazy-init的单例bean,并且在发生故障时不需要进行错误恢复,则根本没有差异