【问题标题】:Spring vs CDI scopes [closed]Spring vs CDI范围[关闭]
【发布时间】:2020-11-16 13:53:52
【问题描述】:

SpringCDI 的范围之间的确切区别是什么?例如:Singleton (Spring)ApplicationScoped (CDI)

【问题讨论】:

  • Spring还提供Application、Request和Session范围,你可以在spring-web中找到。

标签: spring scope cdi


【解决方案1】:

TL;DR它们是不同的,但您只提到了两个世界的一些范围。

Spring 支持以下范围:

  • 单例
  • 原型
  • 应用程序(网络)
  • 会话(网络)
  • 请求(网络)

因此 SingletonPrototype 范围适用于任何 Spring 应用程序(由 ApplicationContext 管理),即使是命令行实现也是如此。 ApplicationSessionRequest 范围由 spring-web 依赖项引入,并在 Spring 中由 WebAppicationContext 管理。

Spring 通常为 Web 应用程序创建两个 DI 上下文的层次结构。根上下文绑定到主应用程序,并且只提供 Singleton 和 Prototype。 Web 上下文使用根上下文作为父上下文,绑定到 servlet 上下文并提供所有范围。只有应用程序范围的 bean 可以从 servlet 上下文中用作属性(另请参阅 here)。

Jakarta EE 提供以下build-in scopes

  • 应用
  • 会话
  • 转化
  • 请求

对于 Jakarta CDI,内置范围的支持取决于容器管理。 Servlet 容器通常支持上述所有内容,其他容器可能仅支持 Application 范围,在这种情况下,其行为类似于 Spring Singleton 范围。

ApplicationSessionRequest 的范围在这两个世界中是相似的。在 Spring 中没有开箱即用的会话范围,但您可以在两个世界中实现自定义范围,并且会话可以类似于 Spring 中的会话范围来实现。

【讨论】:

  • @BalusC 我知道它与 CDI 有关,但我与 JSF 的链接(据我所知,对话范围最初来自该链接)具有误导性 - 谢谢!
  • @BalusC 至少对于 Spring,范围 Application、Session 和 Request 仅由 spring-web 依赖项引入。对于 Jakarta,我不确定 servlet 容器之外的 Application 以外的范围的行为。
  • 啊,今天有点蒙眼
猜你喜欢
  • 2013-12-01
  • 2011-09-30
  • 2018-03-09
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 2019-03-17
  • 2015-08-13
相关资源
最近更新 更多