【问题标题】:Spring bean's DESTROY-METHOD attribute and web-application "prototype"d beanSpring bean 的 DESTROY-METHOD 属性和 web-application “prototype”d bean
【发布时间】:2011-02-18 01:57:30
【问题描述】:

可以使用属性“destroy-method”。

首先,即使我在“destroy-method”属性中输入不存在的方法名称,

Spring 初始化完成得很好(已经很奇怪了!)。

接下来,当一个bean有一个“原型”作用域时,那么我想它必须在应用程序之前被销毁

已关闭。这不会发生,在我的情况下根本不会调用它。

不过,在提取这个 bean 之后,我可以显式调用这个方法,它就完成了它的工作。

您能解释一下为什么在我的 Spring 2.5 案例中从未调用此方法吗?

附言该方法存在,它是公共的并且没有参数。

这似乎比我想象的要困难。

问题是每当上下文关闭时都会调用这个destroy方法,并且 这种情况很少见。

我的问题是这样的:

我有一个网络应用程序。我有一个“原型”范围的 bean。

我需要的是当当前会话关闭时,这个destroy方法被Spring自动调用了。

我可以手动完成,但是有什么解决方案可以让 Spring 完成这项工作吗?它会在会话被销毁后销毁 bean,Spring 有可能在销毁之前调用该 bean 上的方法吗?

附言Spring 不管理原型 bean 的生命周期,因此 Spring 不会销毁它们 :)

【问题讨论】:

  • 也许你应该试着看看方面
  • 你能解释一下这个 bean 的作用吗,为什么你需要在每个会话中销毁它,等等?我有一种感觉,您可能会根据您认为需要解决的问题提出问题,但真正的问题/问题可能有一个更简单的解决方案。例如,这个 bean 是否处理某种资源(例如数据库连接)?
  • @matt b 假设,当会话关闭时,这个 bean 必须记录一条语句“我正在被销毁”。我现在看到 Spring 不处理原型,所以只有一种方法:在 servlet 中手动进行。 Spring 在这里帮不上什么忙。
  • 这是您用例的全部内容吗?如果是这样,只需使用 HttpSessionListener。
  • @Espen @matt b 我只需要一个会话范围! Spring 管理它,当然我可以使用它来代替“原型”。太棒了!

标签: java spring scope javabeans


【解决方案1】:

Spring 容器不管理原型 bean。

来自reference documentation的sn-p:

因此,虽然初始化 生命周期回调方法被调用 在所有对象上,无论范围如何,在 原型的情况,已配置 销毁生命周期回调是 没有调用。

如果可能,请尝试请求或会话范围。

当 HTTP Session 最终 丢弃,范围为的 bean 那个特定的 HTTP 会话也是 丢弃。

顺便说一句:会话和请求范围仅在您使用可感知网络的 ApplicationContext(例如 XmlWebApplicationContext)时才有效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多