Spring beans,在 XmlWebApplicationContext(web上下文)中的生命周期

3
我已经找到了一个关于这个问题的之前的SF问题,我相信设置init-methoddestroy-method属性就足够了。但我想以不同的方式提出问题,以进一步加深我的理解。
如果我理解正确,实现org.springframework.context.Lifecycle接口的类在Web应用程序上下文(即org.springframework.web.context.support.XmlWebApplicationContext)中的行为与其他应用程序上下文不同?这是因为XmlWebApplicationContextstart()(将启动包含的Lifecycle bean)将在加载上下文配置文件之前执行。
这是正确的吗?
2个回答

1

我不这么认为。 start() 方法是由 doStart() 调用的,两者都在 AbstractApplicationContext 中,它是所有应用程序上下文的超类。因此不应该有任何区别。


我看到并且也认为同样的事情。我跟着那段代码走,但是我从未在 Web 应用程序中看到它被调用。我正在尝试查看 doStart() 是否被我的应用程序加载的应用上下文所调用。我今天会继续尝试并让你知道结果。 - Matt

1

Lifecycle 接口应该由希望参与容器生命周期的 bean 实现。这主要是由容器本身实现的(请参见此处的文档),尽管容器中的 bean 也可以选择实现它,启动/停止信号也将传播到它们。

start()stop() 方法本质上是通知容器刚刚启动或即将停止。

我很难找到一个适用于应用程序组件的好用例。业务对象只应关注其自身的生命周期,而不是容器的生命周期。其中一个很好的原因是当您使用非单例作用域(例如请求范围)时,bean 的生命周期独立于容器的生命周期。


谢谢。你发给我的链接似乎并没有表明Lifecycle只适用于容器。它将其作为bean生命周期进行讨论。事实上,我之前并不知道SmartLifecycle等内容。我同意一个对象对自身拥有的控制越多越好,但通常情况下对象的生命周期存在是因为它无法控制某些东西。 - Matt
@Matt:我的意思是Lifecycle仅适用于容器的生命周期,而不仅仅是容器。如果Bean选择,它们可以参与容器的生命周期,但这是一个非常特定的要求。 - skaffman
谢谢,现在更清楚了。那么对于 Web 应用程序和 XmlWebApplicationContext,容器的生命周期是在加载 bean 定义之前启动的吗?这就是为什么我没有看到我的定义的 bean 调用 start() 方法的原因吗? - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接