【问题标题】:Does annotating a bean @DependsOn mean the dependent bean will be instantiated or initialized?注释 bean @DependsOn 是否意味着依赖 bean 将被实例化或初始化?
【发布时间】:2012-02-08 00:17:19
【问题描述】:

我使用的是 Spring 3.0.2。我有两个相对简单的 bean 定义。一个有一个@PostConstruct(bean'A'),它触发@DependsOn bean(bean'B')需要准备的一系列事件。然而,即使我说 bean 'A' 依赖于 bean 'B',bean 'A' 的事件(生命周期方法)似乎在 bean 'B' 完全初始化之前运行。

通过@DependsOn 声明一个bean 是“依赖的”(或者就此而言,在bean 定义中依赖)是否意味着依赖bean 的生命周期方法将在依赖于所述bean 的bean 之前完成?

bean 'B' 生命周期方法会在 bean 'A' 之前完成吗?

更新

Bean A 是一个自定义类,它使用 JMS 模板发送消息,宣布他已初始化。

所述消息的接收者对其进行处理并将其配置转发到 MessageListeningContainer (Bean B)。

第一部分发生在 Bean B 被 DefaultLifecycleProcessor 启动之前。

@Component
@DependsOn("beanB")
public class BeanA {
    @PostConstruct
    public void init() {
        // do stuff
    }
}

<bean id="beanB" class="org.springframework.jms.listener.DefaultMessageListenerContainr">
    <!-- other configuration -->
</bean>

我在我的 init 方法中添加了 bean b 的注入和两个日志语句:

container.isRunning();
container.isActive();

查看了spring源码,isActive在Initialization方法(doInitialized完成)后设置为true。 isRunning 在 doStart 完成后设置。 doStart 由 DefaultLifecycleProcessor 触发,这是在调用 @PostConstruct 注释方法之后发生的。

如何保证在 bean b 初始化并启动后调用我的 Postconstruct 方法?

【问题讨论】:

  • (你的类 defs 的骨架可能有助于理解;我发现这有点难以阅读。)

标签: java spring jms spring-jms


【解决方案1】:

在您的特定情况下,bean A 的 @PostConstruct 方法在 B 完全初始化之前不会被调用,即。它的所有依赖项都被注入并且其@PostConstruct 完成执行。

更新: 由于您在这里依赖 Spring Lifecycle 功能,您可以在 A 中实现 Lifecycle 并将您的 JMS 调用移动到那里的 start() 方法吗?

【讨论】:

  • 这似乎是真的。我在 bean A 后期构造期间检查了我的 bean B。但是,Bean B 不仅有一个初始化实现(InitializingBean),它还实现了 LifeCycle 接口。似乎 LifecycleProcessor 在 bean 初始化后被调用。所以看来我需要将我的 post 构造更改为生命周期阶段的实现。
  • 进一步挖掘我看到首先处理注释,然后是接口。这是真正的问题。由于 Bean B 实现了接口,它的生命周期开始方法直到被注解的方法之后才会被调用。
  • @predhme 也许使用 bean 依赖机制不是组织异步处理交互的最佳方式,您似乎在这里处理。您是否考虑过将处理启动与 bean 初始化分开,并从专用的单个 bean 中编排它?这里仍然缺少很多有用的信息。
  • 我更新了我的类,以便它实现生命周期接口。我更改的方法 init 以实现 start 方法。但是,现在永远不会调用此方法。这是因为我的 bean 是 @Component 吗?
  • @predhme 对,你应该使用SmartLifecycle 而不是Lifecycle 并将isAutoStartup 实现为return true
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多