bean初始化完成后如何调用方法?

时间:2009-07-06 18:31:49

标签: spring initialization startup applicationcontext

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

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

如何做得好呢?

6 个答案:

答案 0 :(得分:295)

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

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

答案 1 :(得分:194)

您可以使用以下内容:

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

这将在实例化bean时调用“init”方法。

答案 2 :(得分:98)

有三种不同的方法需要考虑,如reference

中所述

使用init-method属性

优点:

  • 不要求bean实现接口。

缺点:

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

实现InitializingBean

优点:

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

缺点:

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

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

优点:

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

缺点:

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

答案 3 :(得分:38)

您是否尝试过实施InitializingBean?这听起来就像你正在追求的那样。

缺点是你的bean会变成Spring知识,但在大多数应用程序中都不是那么糟糕。

答案 4 :(得分:8)

您可以在应用程序上下文中部署自定义BeanPostProcessor来执行此操作。或者,如果您不介意在bean中实现Spring接口,可以使用InitializingBean接口或“init-method”指令(相同链接)。

答案 5 :(得分:-7)

进一步澄清对这两种方法的混淆,即使用

  1. @PostConstruct
  2. init-method="init"
  3. 从个人经验来看,我意识到使用(1)只能在servlet容器中工作,而(2)适用于任何环境,甚至在桌面应用程序中。因此,如果您在独立应用程序中使用Spring,则必须使用(2)执行“在初始化后调用此方法。”