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

Java 注释bean@DependsOn是否意味着依赖bean将被实例化或初始化?,java,spring,jms,spring-jms,Java,Spring,Jms,Spring Jms,我正在使用Spring3.0.2。我有两个相对简单的bean定义。一个是@PostConstruct(bean'a'),它触发了@DependsOn bean(bean'B')需要准备的一系列事件。然而,即使我声明bean“A”依赖于bean“B”,bean“A”的事件(生命周期方法)似乎在bean“B”完全初始化之前运行 通过@DependsOn声明一个bean是“依赖的”(或者就此而言,在bean定义中依赖于)是否意味着依赖bean的生命周期方法将在依赖于该bean的bean之前完成 bea

我正在使用Spring3.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模板发送消息,通知他已初始化

所述消息的接收者处理该消息并将其配置转发给MessageListingContainer(Bean B)

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

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

<bean id="beanB" class="org.springframework.jms.listener.DefaultMessageListenerContainr">
    <!-- other configuration -->
</bean>
我查看了spring源代码,在初始化方法(doInitialized完成)之后,isActive被设置为true。在doStart完成后设置isRunning。doStart由DefaultLifecycleProcessor触发,该处理器在调用@PostConstruct注释的方法之后发生


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

在您的特定情况下,bean A的
@Postconstruct
方法在b完全初始化之前不会被调用,也就是说,它的所有依赖项都被注入并且它的
@Postconstruct
完成执行

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

(您的类defs的框架可能有助于理解;我发现这有点难理解。)这似乎是真的。在bean A post构造期间,我检查了bean B。然而,Bean B不仅有一个初始化实现(InitializingBean),而且还实现了生命周期接口。似乎生命周期处理器是在bean初始化之后调用的。因此,我似乎需要将post构造更改为生命周期阶段的实现。这才是真正的问题。由于Bean B实现了接口,它的Lifecycle start方法在注释方法之后才被调用。@predhme可能使用Bean依赖机制不是组织异步处理交互的最佳方法,您在这里似乎正在处理这些交互。您是否考虑过将处理启动与bean初始化分离,并将其与专用的单个bean协调?这里仍然缺少很多有用的信息。我更新了我的类,以便它实现生命周期接口。方法init I更改为实现start方法。但是,现在从未调用此方法。这是因为我的bean是一个@Component吗?@predhme是的,您应该使用
SmartLifecycle
而不是
Lifecycle
,并将
isAutoStartup
实现为
返回true
container.isRunning();
container.isActive();