13

我在以下博客中看到了“应用程序”范围。这是真的吗?

http://www.concretepage.com/spring/spring-bean-scope-example-using-scope-annotation-and-xml-for-singleton-prototype-request-session-global-session-and-application-scope-带范围代理

因为,根据我的冲浪,我知道 spring 只有以下 5 个范围。如果我错了,请纠正我。

  1. 辛格尔顿
  2. 原型
  3. 要求
  4. 会议
  5. 全球会议
4

2 回答 2

19

官方文档中有一个与 bean 范围相关的部分:

基本上,他们定义了下一个:

单例(默认)将单个 bean 定义限定为每个 Spring IoC 容器的单个对象实例。

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

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

session 将单个 bean 定义限定为 HTTP 会话的生命周期。仅在 Web 感知 Spring ApplicationContext 的上下文中有效。

globalSession 将单个 bean 定义限定为全局 HTTP 会话的生命周期。通常仅在 Portlet 上下文中使用时才有效。仅在 Web 感知 Spring ApplicationContext 的上下文中有效。

application 将单个 bean 定义限定为 ServletContext 的生命周期。仅在 Web 感知 Spring ApplicationContext 的上下文中有效。

websocket 将单个 bean 定义限定为 WebSocket 的生命周期。仅在 Web 感知 Spring ApplicationContext 的上下文中有效。


此外,由于 Spring 3.0 存在其他作用域 线程作用域但默认情况下未注册,因此您甚至可以创建自己的作用域:

从 Spring 3.0 开始,线程范围可用,但默认情况下未注册。有关详细信息,请参阅 SimpleThreadScope 的文档。有关如何注册此或任何其他自定义范围的说明,请参阅“使用自定义范围”一节。

有一个部分解释了如何定义您的自定义范围:


就 而言Application scope,他们将其定义为下一个:

Spring 容器通过为整个 Web 应用程序使用一次 appPreferences bean 定义来创建 AppPreferences bean 的新实例。也就是说,appPreferences bean 的范围是 ServletContext 级别,存储为常规 ServletContext 属性。

它还解释了 Spring 单例 bean 之间的区别:

这有点类似于 Spring 单例 bean,但在两个重要方面有所不同:它是每个 ServletContext 的单例,而不是每个 Spring 'ApplicationContext'(在任何给定的 Web 应用程序中可能有多个),它实际上是公开的,因此作为 ServletContext 属性可见

因此,如果您希望使用 XML:

<bean id="apps" class="com.App" scope="application"/>

或注释:

@ApplicationScope
@Component
public class App {
    // ...
}
于 2017-06-05T04:22:41.910 回答
2

application 将单个 bean 定义限定为 ServletContext 的生命周期。仅在 Web 感知 Spring ApplicationContext 的上下文中有效。

点击链接了解更多详情: http ://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-factory-scopes

于 2017-06-05T04:19:22.103 回答