Spring 与 CDI 范围

Spring vs CDI scopes

SpringCDI 的范围有哪些确切区别?例如:Singleton (Spring)ApplicationScoped (CDI)

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

Spring 支持以下范围:

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

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

中的 WebAppicationContext

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

Jakarta EE 提供以下 build-in scopes

  • 申请
  • 会话
  • 转化
  • 请求

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

范围 ApplicationSessionRequest 在两个世界中都是相似的。 Spring 中没有开箱即用的 Conversation 作用域,但您可以在两个世界中实现自定义作用域,Conversation 可以类似于 Spring.

中的 Session 作用域来实现