【发布时间】:2020-11-16 13:53:52
【问题描述】:
Spring 和 CDI 的范围之间的确切区别是什么?例如:Singleton (Spring) 和 ApplicationScoped (CDI)
【问题讨论】:
-
Spring还提供Application、Request和Session范围,你可以在spring-web中找到。
Spring 和 CDI 的范围之间的确切区别是什么?例如:Singleton (Spring) 和 ApplicationScoped (CDI)
【问题讨论】:
TL;DR它们是不同的,但您只提到了两个世界的一些范围。
Spring 支持以下范围:
因此 Singleton 和 Prototype 范围适用于任何 Spring 应用程序(由 ApplicationContext 管理),即使是命令行实现也是如此。 Application、Session 和 Request 范围由 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 范围。
Application、Session 和 Request 的范围在这两个世界中是相似的。在 Spring 中没有开箱即用的会话范围,但您可以在两个世界中实现自定义范围,并且会话可以类似于 Spring 中的会话范围来实现。
【讨论】:
spring-web 依赖项引入。对于 Jakarta,我不确定 servlet 容器之外的 Application 以外的范围的行为。