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

p4tfgftt  于 2023-10-15  发布在  Spring
关注(0)|答案(6)|浏览(139)

我有一个用例,需要在加载ApplicationContext时仅调用bean中的(非静态)方法一次。如果我使用MethodsManagingFactoryBean来做这个,可以吗?或者我们有更好的解决办法?
作为一个侧面说明,我使用ConfigContextLoader来加载Web应用程序中的应用程序上下文。如果bean 'A'被示例化,只需要调用methodA()一次。
这怎么能做得好呢?

knsnq2tg

knsnq2tg1#

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

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

mxg2im7a2#

你可以使用类似的东西:

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

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

fwzugrvs

fwzugrvs3#

有三种不同的方法可以考虑,如参考文献

使用init-method属性

优点:

  • 不需要bean来实现接口。

缺点:

  • 在源代码中没有立即指示在构造之后需要此方法来确保bean被正确配置。

实现InitializingBean

优点:

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

缺点:

  • 比init方法更具侵入性。

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

优点:

  • 在使用组件扫描自动检测bean时很有用。
  • 使其更清楚地表明,一个特定的方法将被用于初始化。意图更接近代码。

缺点:

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

k5hmc34c4#

你试过使用InitializingBean吗?听起来正是你想要的。
缺点是您的bean将成为Spring感知的,但在大多数应用程序中,这并不是那么糟糕。

ebdffaop

ebdffaop5#

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

slmsl1lt

slmsl1lt6#

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

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

相关问题