【问题标题】:Spring Request and Prototype Scope?Spring 请求和原型范围?
【发布时间】:2011-09-22 17:27:13
【问题描述】:

下面是 Spring 中原型和请求范围的定义。

原型 将单个 bean 定义限定为任意数量的对象实例。

请求 将单个 bean 定义限定为单个 HTTP 请求的生命周期;也就是说,每个 HTTP 请求都有自己的 在单个 bean 定义的后面创建的 bean 实例。仅在 Web 感知 Spring ApplicationContext 的上下文中有效。

据我了解,在原型范围的情况下,一些池将由核心容器维护。它将为该池中的 bean 实例提供服务。 在请求范围的情况下,将为每个 http 请求提供新的 bean。理解有偏差请指正?

如果上述陈述为真,那么如果 bean 保持某种状态,则不应将范围定义为原型,而应将其定义为原型 按要求。对吗?

【问题讨论】:

  • 最佳解释。还有一个问题:对于原型范围的 bean “客户端代码必须清理原型范围的对象并释放原型 bean 持有的昂贵资源。”什么是请求范围 bean。请求范围的 bean 会由 IOC 容器处理吗?谢谢:)

标签: spring


【解决方案1】:

我在网上找到的最好的一个

每当您在 ApplicationContext 上调用 getBean 时,Prototype 都会创建一个全新的实例。而对于 Request,只为一个 HttpRequest 创建一个实例。因此,在单个 HttpRequest 中,我可以在 Application 上调用 getBean 两次,并且只会实例化一个 bean,而在同一个 HttpRequest 中限定为 Prototype 的同一个 bean 将获得 2 个不同的实例。

HttpRequest 范围

Mark mark1 = context.getBean("mark"); 
Mark mark2 = context.getBean("mark"); 
mark1 == mark2; //This will return true 

原型范围

Mark mark1 = context.getBean("mark"); 
Mark mark2 = context.getBean("mark"); 
mark1 == mark2; //This will return false 

希望能为您解决问题。

【讨论】:

  • 最好的解释!
  • 对于请求范围,如果 context.getBean 是从两个不同的请求中调用的呢?
  • 那么如果每个请求只有一个 getBean() 调用,那么原型和请求范围将是等效的吗?
  • @KARTHIK 如果您扩展答案,会更清楚地说明在比较 bean 之前如何应用 Request 和 Prototype 范围以及应用这些范围的原因和位置。
  • 最佳解释。一个问题:对于原型范围的 bean “客户端代码必须清理原型范围的对象并释放原型 bean 持有的昂贵资源。”什么是请求范围 bean。请求范围的 bean 会由 IOC 容器处理吗?谢谢:)
【解决方案2】:

你走了。原型在文档here 中描述为

"非单例,原型范围 bean部署结果 每次创建一个新的 bean 实例 对特定 bean 的请求时间 制作完成。”

您对请求范围 bean 的描述是准确的。

可能只是与原型与单例的电线交叉。

【讨论】:

    【解决方案3】:

    每次在 ApplicationContext 上调用 getBean 方法时,原型作用域都会创建一个新实例。而对于请求范围,只为 HttpRequest 创建一个实例。

    所以在一个 HttpRequest 中,如果 getBean 方法在 Application 上被调用两次,并且只有一个 bean 被实例化和重用,而在同一个 HttpRequest 中限定为 Prototype 的 bean 将获得 2 个不同的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 2012-03-28
      • 2011-08-15
      相关资源
      最近更新 更多