Spring 请求和原型范围?

新手上路,请多包涵

下面是 Spring 中原型和请求作用域的定义。

prototype 将单个 bean 定义的范围限定为任意数量的对象实例。

request 将单个 bean 定义范围限定为单个 HTTP 请求的生命周期;也就是说,每个 HTTP 请求都会有自己的 bean 实例,该实例是在单个 bean 定义的基础上创建的。仅在 web-aware Spring ApplicationContext 的上下文中有效。

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

如果上面的陈述是正确的,那么如果 bean 持有某种状态,那么范围不应该被定义为原型,而应该被定义为请求。正确的?

原文由 M Sach 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 391
2 个回答

你没电了原型在 此处 的文档中描述为

“每次请求特定 bean 时,bean 部署的非单例原型范围都会创建一个新的 bean 实例。”

您对请求作用域 bean 的描述是准确的。

可能只是在原型与单身人士之间交叉了线。

原文由 hvgotcodes 发布,翻译遵循 CC BY-SA 3.0 许可协议

每次您在 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

希望这能帮您解决问题。

原文由 KARTHIK 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题