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

我有一个用例,我只需要在Bean上调用一个(非静态)方法,一次在ApplicationContext加载。 没关系,如果我使用MethodInvokingFactoryBean? 或者我们有一个更好的解决scheme?

作为一个方面说明,我使用ConfigContextLoaderListener在Web应用程序中加载应用程序上下文。 而且,如果bean“A”被实例化,只需调用methodA()一次。

这怎么可以做得很好?

你可以使用像这样的东西:

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

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

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

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

如参考文献中所述,有三种不同的方法需要考虑

使用init-method属性

优点:

  • 不需要bean来实现一个接口。

缺点:

  • 没有立即指示这种方法是必须的,以确保bean被正确configuration。

实现InitializingBean

优点:

  • 无需指定init-method,或打开组件扫描/注释处理。
  • 适合与库一起提供的bean,我们不希望使用这个库的应用程序关注自己的bean生命周期。

缺点:

  • 比初始方法更有侵略性。

使用JSR-250 @PostConstruct lifecyle注释

优点:

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

缺点:

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

你有没有尝试实现InitializingBean ? 听起来好像你在做什么。

缺点是你的bean变得意识到Spring,但在大多数应用程序中并不那么糟糕。

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

为了进一步澄清有关这两种方法的困惑,即使用

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

从个人经验来看,我意识到使用(1)只能在servlet容器中工作,而(2)在任何环境下工作,即使在桌面应用程序中也是如此。 所以,如果你在独立的应用程序中使用Spring,你将不得不使用(2)来执行“在初始化之后调用这个方法。