我有一个用例,我需要在 ApplicationContext 加载时仅调用一次 bean 中的(非静态)方法。如果我使用 MethodInvokingFactoryBean 可以吗?或者我们有更好的解决方案?

附带说明一下,我使用 ConfigContextLoaderListener 在 Web 应用程序中加载应用程序上下文。并且希望,如果 bean 'A' 被实例化,只需调用 methodA() 一次。

这件事怎样才能做得好呢?

有帮助吗?

解决方案

您可以使用这样的:

<beans>
    <bean id="myBean" class="..." init-method="init"/>
</beans>

当bean被实例化这将调用“初始化”方法。

其他提示

为了扩展其他答案中的 @PostConstruct 建议,在我看来,这确实是最好的解决方案。

  • 它使您的代码与 Spring API 解耦(@PostConstruct 在 javax.* 中)
  • 它显式地将您的 init 方法注释为需要调用来初始化 bean 的方法
  • 你不需要记住将 init-method 属性添加到你的 spring bean 定义中,spring 会自动调用该方法(假设你在上下文中的其他地方注册了annotation-config 选项)。

如 中所述,可以考虑三种不同的方法 参考

使用 init-method 属性

优点:

  • 不需要bean 来实现接口。

缺点:

  • 构建后不需要立即指示此方法以确保 bean 正确配置。

实现初始化Bean

优点:

  • 无需指定init-method,或开启组件扫描/注释处理。
  • 适用于由库提供的 bean,我们不希望使用该库的应用程序关心 bean 生命周期。

缺点:

  • 比 init-method 方法更具侵入性。

使用JSR-250 @PostConstruct 生命周期注释

优点:

  • 当使用组件扫描来自动检测 bean 时很有用。
  • 明确要使用特定方法进行初始化。意图更接近代码。

缺点:

  • 初始化不再在配置中集中指定。
  • 您必须记住打开注释处理(有时可能会忘记)

您是否尝试过实施 InitializingBean?听起来正是您所追求的。

缺点是您的 bean 变得支持 Spring,但在大多数应用程序中这还不错。

您可以部署一个自定义的在你的应用程序上下文做的BeanPostProcessor 。或者,如果你不介意实现在bean Spring的接口,你可以使用的的InitializingBean 接口或 “初始化方法” 指令(同一个链接)。

为了进一步消除对这两种方法的任何混淆,即使用

  1. @PostConstruct
  2. init-method="init"

根据个人经验,我意识到使用(1)仅适用于 servlet 容器,而(2)适用于任何环境,甚至在桌面应用程序中。因此,如果您要在独立应用程序中使用 Spring,则必须使用 (2) 来执行“初始化后调用此方法”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top