我有一个用例,我只需要在bean中调用一个(非静态)方法——在ApplicationContext加载时调用一次。如果我用MethodInvokingFactoryBean来做这个可以吗?或者我们有更好的解决方案?
作为旁注,我使用ConfigContextLoaderListener来加载web应用程序中的应用程序上下文。并且,如果bean 'A'被实例化,只需调用methodA()一次。
怎样才能很好地做到这一点呢?
我有一个用例,我只需要在bean中调用一个(非静态)方法——在ApplicationContext加载时调用一次。如果我用MethodInvokingFactoryBean来做这个可以吗?或者我们有更好的解决方案?
作为旁注,我使用ConfigContextLoaderListener来加载web应用程序中的应用程序上下文。并且,如果bean 'A'被实例化,只需调用methodA()一次。
怎样才能很好地做到这一点呢?
当前回答
您可以在应用程序上下文中部署一个自定义BeanPostProcessor来实现这一点。或者,如果您不介意在bean中实现Spring接口,您可以使用InitializingBean接口或“init-method”指令(相同的链接)。
其他回答
你可以这样使用:
<beans>
<bean id="myBean" class="..." init-method="init"/>
</beans>
这将在bean实例化时调用“init”方法。
您可以在应用程序上下文中部署一个自定义BeanPostProcessor来实现这一点。或者,如果您不介意在bean中实现Spring接口,您可以使用InitializingBean接口或“init-method”指令(相同的链接)。
如参考文献中所述,有三种不同的方法需要考虑
使用init-method属性
优点:
不需要bean来实现接口。
缺点:
源代码中没有立即表明在构造bean后需要此方法以确保正确配置bean。
实现InitializingBean
优点:
不需要指定init-method,也不需要打开组件扫描/注释处理。 适用于随库提供的bean,我们不希望使用这个库的应用程序关注bean的生命周期。
缺点:
比init-method方法更具侵入性。
使用JSR-250 @PostConstruct生命周期注释
优点:
在使用组件扫描自动检测bean时非常有用。 使初始化时使用的特定方法更加清晰。意图更接近于代码。
缺点:
初始化不再集中在配置中指定。 您必须记得打开注释处理(有时可能会忘记)
要在其他答案中扩展@PostConstruct建议,在我看来,这确实是最好的解决方案。
它使你的代码与Spring API分离(@PostConstruct在javax中。*) 它显式地将init方法注释为需要调用它来初始化bean的方法 您不需要记住将init-method属性添加到spring bean定义中,spring将自动调用该方法(假设您在上下文中的其他地方注册了annotation-config选项)。
您尝试实现InitializingBean了吗?听起来正是你想要的。
缺点是您的bean可以感知spring,但在大多数应用程序中,这并不是那么糟糕。