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

pea*_*kit 228 spring initialization startup applicationcontext

我有一个用例,我需要在ApplicationContext加载时只在bean中调用一个(非静态)方法.如果我使用MethodInvokingFactoryBean吗?或者我们有更好的解决方案?

作为旁注,我使用ConfigContextLoaderListener在Web应用程序中加载应用程序上下文.并希望,如果bean'A'被实例化,只需调用methodA()一次.

怎么能很好地做到这一点?

ska*_*man 304

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

  • 它使您的代码与Spring API分离(@PostConstruct在javax.*中)
  • 它显式地将您的init方法注释为需要调用以初始化bean的东西
  • 你并不需要记住给init-method属性添加到您的Spring bean定义,弹簧会自动调用该方法(假设你注册的背景下,其他地方的注解配置选项,反正).

  • 在阅读这篇文章之前,我不知道@PostConstruct.帮助我,谢谢. (9认同)
  • 谢谢,这很有效.注意,如果要与Spring一起使用,则必须包含"<context:annotation-config />"来注册CommonAnnotationBeanPostProcessor bean(如上所述) (9认同)
  • PostConstruct的JavaDoc说每个类只能用它注释一个方法:http://docs.oracle.com/javaee/5/api/javax/annotation/PostConstruct.html (5认同)
  • 一个合适的`<context:component-scan>`也可以工作,如果你的类路径上有很大的非Spring库,那么它可以减少启动时间. (2认同)
  • 当您实例化的bean不是您自己的类而是某些第三方类时,@ PostConstruct也不会对您有多大用处 (2认同)

Mer*_*ste 196

您可以使用以下内容:

<beans>
    <bean id="myBean" class="..." init-method="init"/>
</beans>
Run Code Online (Sandbox Code Playgroud)

这将在实例化bean时调用"init"方法.

  • 但是,postConstruct在大多数情况下应该更好,因为我们不想搞砸spring bean初始化. (14认同)
  • @ lwpro2你的意思是"不想搞砸春豆初始化"这里是什么意思? (4认同)
  • 谢谢,我真的在寻找像Spring一样的东西. (2认同)

too*_*kit 101

参考文献中所述,有三种不同的方法可供考虑

使用init-method属性

优点:

  • 不需要bean来实现接口.

缺点:

  • 在构造之后不需要立即指示此方法以确保正确配置bean.

实现InitializingBean

优点:

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

缺点:

  • 比init-method方法更具侵入性.

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

优点:

  • 使用组件扫描自动检测bean时很有用.
  • 清楚地表明将使用特定方法进行初始化.意图更接近代码.

缺点:

  • 初始化不再在配置中集中指定.
  • 你必须记得打开注释处理(有时可能会忘记)

  • 我认为它实际上是一件好事使用`@ PostConstruct`正是因为它是需要方法调用在初始化处理结束类的一部分. (4认同)

Jon*_*eet 39

你试过实施InitializingBean吗?这听起来就像你正在追求的那样.

缺点是你的bean变得对Spring有所了解,但在大多数应用程序中并没有那么糟糕.

  • Oliver给了我一些很好的借口,但实际上我只是忘记了init方法:)另一个原因是类型本身知道它需要在所有属性设置后"完成" - 它不是从根本上说*应该*在配置中. (7认同)
  • 这是一个品味问题.该接口是Spring组件模型的一部分,只为此目的而服务,而对于自定义命名方法,可能并不是很明显必须调用它才能完成组件生命周期.所以这主要是为了沟通.当然还有引入依赖于Spring框架的缺点.介于两者之间的一个很好的方法是使用@PostConstruct,因为它具有明确的语义但不引入依赖... (4认同)
  • 您是否有理由选择在XML中指定init-method来实现接口? (2认同)

Rob*_*b H 8

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