【问题标题】:How to choose different initialization strategy for Spring Beans?如何为 Spring Beans 选择不同的初始化策略?
【发布时间】:2012-09-26 11:21:52
【问题描述】:

在此日志中捕获了默认的 bean 初始化策略:

[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.Instance> setBeanName() asda
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsa, message: create()
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsa, message: start()
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: create()
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: start()
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: stop()
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: destroy()
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsa, message: stop()
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsa, message: destroy()

在调用它的 start() 方法后,Bean 被认为是完全初始化的。现在我想做的是同步初始化所有的bean。在所有其他 bean 完成其步骤之前,没有 bean 将继续下一个初始化步骤。生成的日志如下所示:

[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.Instance> setBeanName() asda
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsa, message: create()
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: create()
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsa, message: start()
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: start()
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsa, message: stop()
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: stop()
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsa, message: destroy()
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: destroy()

关于如何实现这一点的任何想法?

另外,是否可以在后台线程中处理所有初始化(每个 bean 的每个生命周期步骤)?我预计初始化会非常耗时......

【问题讨论】:

  • 所以没有做任何事情......我在 Spring 中还没有那么“流利”,但我相信也许有自定义 LifecycleProcessor 和 BeanPostProcessor 来控制 PostConstruct 和 PreDestroy 可能会提供一个解决方案......虽然它偶然发现一个可以完成所有这些的实现会好得多:)我还提出了两个我想解决的问题。现在不进行并行初始化而只有同步初始化是完全可以接受的。

标签: spring javabeans lifecycle


【解决方案1】:

关于如何实现这一点的任何想法?

您可以使用 &lt;bean depends-on="..."/&gt; 表示法或使用注解 org.springframework.context.annotation.DependsOn 来管理 Spring 生命周期。

另外,是否可以在后台线程中处理所有初始化(每个 bean 的每个生命周期步骤)?

在 bean 的 init() 或 destroy() 方法中(通过 InitializingBean/DisposableBean 或通过 PostConstruct/PreDestroy),您可以创建不同的线程来初始化/销毁它。

【讨论】:

  • DependsOn 依赖于 bean 级别,而不是初始化步骤级别(如果我们可以这样称呼它)。我也知道我可以自己运行线程,但我询问了 Spring 支持它的特性
猜你喜欢
  • 2013-09-21
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多