bean范围

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 范围

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

初始 Web 配置

为了支持豆的范围界定在requestsessionapplication,和 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 作用域机制是可扩展的。您可以定义自己的范围,甚至重新定义现有范围,尽管后者被认为是不好的做法,并且您不能覆盖内置singletonprototype范围。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕布辕门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值