注释 bean @DependsOn 是不是意味着依赖 bean 将被实例化或初始化?

Posted

技术标签:

【中文标题】注释 bean @DependsOn 是不是意味着依赖 bean 将被实例化或初始化?【英文标题】: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 的骨架可能有助于理解;我发现这有点难以阅读。) 【参考方案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

以上是关于注释 bean @DependsOn 是不是意味着依赖 bean 将被实例化或初始化?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Spring 忽略了我的 @DependsOn 注释?

踩坑:@PostConstruct@DependsOn@Order注解嵌套使用解决Bean加载优先级问题

踩坑:@PostConstruct@DependsOn@Order注解嵌套使用解决Bean加载优先级问题

指定spring中bean启动的顺序

Spring @Lazy

Spring @Lazy