如何在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”指令(同一个链接)。
为了进一步澄清有关这两种方法的困惑,即使用
-
@PostConstruct
和 -
init-method="init"
从个人经验来看,我意识到使用(1)只能在servlet容器中工作,而(2)在任何环境下工作,即使在桌面应用程序中也是如此。 所以,如果你在独立的应用程序中使用Spring,你将不得不使用(2)来执行“在初始化之后调用这个方法。