• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
isuning
博客园    首页    新随笔    联系   管理    订阅  订阅
bean范围

目录

  • bean范围
        • 单例范围
        • 原型范围
        • 请求、会话、应用程序和 WebSocket 范围
          • 初始 Web 配置
          • 请求范围
          • 会话范围
          • 应用范围
          • WebSocket 范围
        • 自定义范围

bean范围

当您创建一个 bean 定义时,您创建了一个用于创建由该 bean 定义的类的实际实例的方法。您可以从这个模板创建许多对象实例。

Spring 框架支持六个范围,其中四个仅在您使用 web应用时可用

范围描述
singleton(默认)将单个 bean 定义限定为每个 Spring IoC 容器的单个对象实例。
prototype将单个 bean 定义限定为任意数量的对象实例。
request将单个 bean 定义限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有自己的 bean 实例,该实例是在单个 bean 定义的后面创建的。仅在 Web 感知 Spring 的上下文中有效ApplicationContext。
session将单个 bean 定义限定为 HTTP 的生命周期Session。仅在 Web 感知 Spring 的上下文中有效ApplicationContext。
application将单个 bean 定义限定为ServletContext. 仅在 Web 感知 Spring 的上下文中有效ApplicationContext。
WebSocket将单个 bean 定义限定为WebSocket. 仅在 Web 感知 Spring 的上下文中有效ApplicationContext。

单例范围

只有一个单例 bean 的共享实例被管理

原型范围

导致每次对特定 bean 发出请求时都会创建一个新的 bean 实例。

<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>

请求、会话、应用程序和 WebSocket 范围

在request,session,application,和websocket范围只有当你使用一个基于web的Spring可ApplicationContext实现

初始 Web 配置

为了支持豆的范围界定在request,session,application,和 websocket(即具有web作用域bean),需要做少量的初始配置定义你的豆之前。

如何完成此初始设置取决于您的特定 Servlet 环境。

对于 Servlet 3.0+,这可以通过使用WebApplicationInitializer 接口以编程方式完成。或者,或者对于较旧的容器,将以下声明添加到您的 Web 应用程序的web.xml文件中:

<web-app>
    ...
    <listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
    </listener>
    ...
</web-app>

或者,如果您的侦听器设置存在问题,请考虑使用 Spring 的 RequestContextFilter

<web-app>
    ...
    <filter>
        <filter-name>requestContextFilter</filter-name>
        <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>requestContextFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    ...
</web-app>
请求范围

考虑以下 bean 定义的 XML 配置:

<bean id="loginAction" class="com.something.LoginAction" scope="request"/>

Spring 容器通过为每个 HTTP 请求LoginAction使用 bean 定义来创建 bean 的新实例。loginAction也就是说, loginActionbean 的作用域是 HTTP 请求级别。

当使用注解驱动的组件或 Java 配置时,@RequestScope注解可用于将组件分配给request范围。以下示例显示了如何执行此操作:

@RequestScope
@Component
public class LoginAction {
    // ...
}
会话范围

考虑以下 bean 定义的 XML 配置:

<bean id="userPreferences" class="com.something.UserPreferences" scope="session"/>

Spring 容器通过在单个 HTTP 的生命周期中会话使用 bean 定义来创建 bean 的新实例。

在使用注解驱动的组件或 Java 配置时,您可以使用 @SessionScope注解将组件分配给session范围。

@SessionScope
@Component
public class UserPreferences {
    // ...
}
应用范围

考虑以下 bean 定义的 XML 配置:

<bean id="appPreferences" class="com.something.AppPreferences" scope="application"/>

Spring 容器通过为整个 Web 应用程序应用使用一次 bean 定义来创建 bean 的新实例。

在使用注解驱动的组件或 Java 配置时,您可以使用 @ApplicationScope注解将组件分配给application范围。以下示例显示了如何执行此操作:

@ApplicationScope
@Component
public class AppPreferences {
    // ...
}
WebSocket 范围

WebSocket 范围与 WebSocket 会话的生命周期相关联,适用于 STOMP over WebSocket 应用程序

自定义范围

bean 作用域机制是可扩展的。您可以定义自己的范围,甚至重新定义现有范围,尽管后者被认为是不好的做法,并且您不能覆盖内置singleton和prototype范围。

posted on 2022-05-01 22:18  吕布辕门  阅读(38)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3