bean初始化完成后如何调用方法?
-
23-08-2019 - |
题
我有一个用例,我需要在 ApplicationContext 加载时仅调用一次 bean 中的(非静态)方法。如果我使用 MethodInvokingFactoryBean 可以吗?或者我们有更好的解决方案?
附带说明一下,我使用 ConfigContextLoaderListener 在 Web 应用程序中加载应用程序上下文。并且希望,如果 bean 'A' 被实例化,只需调用 methodA() 一次。
这件事怎样才能做得好呢?
解决方案
您可以使用这样的:
<beans>
<bean id="myBean" class="..." init-method="init"/>
</beans>
当bean被实例化这将调用“初始化”方法。
其他提示
为了扩展其他答案中的 @PostConstruct 建议,在我看来,这确实是最好的解决方案。
- 它使您的代码与 Spring API 解耦(@PostConstruct 在 javax.* 中)
- 它显式地将您的 init 方法注释为需要调用来初始化 bean 的方法
- 你不需要记住将 init-method 属性添加到你的 spring bean 定义中,spring 会自动调用该方法(假设你在上下文中的其他地方注册了annotation-config 选项)。
如 中所述,可以考虑三种不同的方法 参考
使用 init-method 属性
优点:
- 不需要bean 来实现接口。
缺点:
- 构建后不需要立即指示此方法以确保 bean 正确配置。
实现初始化Bean
优点:
- 无需指定init-method,或开启组件扫描/注释处理。
- 适用于由库提供的 bean,我们不希望使用该库的应用程序关心 bean 生命周期。
缺点:
- 比 init-method 方法更具侵入性。
使用JSR-250 @PostConstruct 生命周期注释
优点:
- 当使用组件扫描来自动检测 bean 时很有用。
- 明确要使用特定方法进行初始化。意图更接近代码。
缺点:
- 初始化不再在配置中集中指定。
- 您必须记住打开注释处理(有时可能会忘记)
您是否尝试过实施 InitializingBean
?听起来正是您所追求的。
缺点是您的 bean 变得支持 Spring,但在大多数应用程序中这还不错。
您可以部署一个自定义的在你的应用程序上下文做的BeanPostProcessor 。或者,如果你不介意实现在bean Spring的接口,你可以使用的的InitializingBean 接口或 “初始化方法” 指令(同一个链接)。
为了进一步消除对这两种方法的任何混淆,即使用
@PostConstruct
和init-method="init"
根据个人经验,我意识到使用(1)仅适用于 servlet 容器,而(2)适用于任何环境,甚至在桌面应用程序中。因此,如果您要在独立应用程序中使用 Spring,则必须使用 (2) 来执行“初始化后调用此方法”。
不隶属于 StackOverflow