第3章—高级装配—bean的作用域
bean的作用域
bean的默认作用域
Spring定义了多种作用域,可以基于这些作用域创建bean,包括:
- 单例(Singleton):在整个应用中,只创建bean的一个实例.
- 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例.
- 会话(Session):在web应用中,为每个会话创建一个bean实例.
- 请求(Request):在web应用中,为每个请求创建一个bean实例.
单例是默认的作用域,但是正如之前所描述,对于易变的类型,这并不合适.如果选择其他作用域,要使用@Scope注解,他可以和@Component或@Bean一起使用.
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class NotPad {
}
@Component
@Scope("prototype")
public class NotPad {
}
当然你也可以用XML来配置bean:
<bean id="notPad" class="com.home.demo2.NotPad" scope="prototype"/>
使用会话和请求作用域
在web的应用中经常会用到会话和请求的作用域,这里就拿购物车这个例子来说吧,每个客户都会向购物车添加商品,这时我们希望当前用户能一直使用对应的bean,这时就需要涉及到会话作用域了,如下进行配置:
@Component
@Scope(
value = WebApplicationContext.SCOPE_SESSION,
proxyMode = ScopedProxyMode.INTERFACES
)
public ShoppingCart Cart {
}
WebApplicationContext.SCOPE_SESSION 这里是指的Spring会为Web应用中的每个会话创建一个ShoppingCart.这里创建多个ShoppingCart的bean的实例,但是对于给定的会话只会创建一个实例,在在当前会话相关的操作中,这个bean实际上相当于单例的.
proxyMode会让每次会话注入到ShoppingCart的bean的代理,从而让所使用的ShoppingCart的实例恰好是当前会话所对应的那一个.
ScopedProxyMode.INTERFACES说明这个代理要实现ShoppingCart接口,从而将调用委托个实现bean.
当然bean原本是具体的类,我们可以设置为proxyMode = ScopedProxyMode.TARGET_CLASS,以此来表明要以生成目标类拓展的方式创建代理.
注意:尽管我们主要关注了会话作用域,但是请求作用域的bean会面临相同的问题,因此,请求作用域的bean应该也以作用域代理的方式进行注入.
在XML中声明作用域的代理
我们也可以通过XML的方式来声明作用域,如下:
<bean id="cart" class="com.home.demo2.Cart" scope="session">
<aop:scoped-proxy/>
</bean>
当然,我们还可以通过roxy-target-class="false"声明基于接口的代理:
<bean id="shoppingCart" class="com.home.demo2.ShoppingCart" scope="session" abstract="true">
<aop:scoped-proxy proxy-target-class="false"/>
</bean>
- mongodb的用法
- silverlight中如何将string(字符串)写入Resource(资源)?
- Python练习环境搭建-引入预定义数据
- 振幅和成交量的关系
- silverlight中的几个冷门标记 {x:Null},d:DesignWidth,d:DesignHeight
- 用scikit-learn和pandas学习线性回归
- 自动驾驶玩出新花招,以后老司机们就要失业了
- silverlight.net官方网站图片切换源码
- 制作iis自动安装包
- 安装程序无法复制一个或多个文件。特定错误码是0x4b8。
- silverlight中"制作逐帧动画"/"播放gif"收集
- Android新手之旅(1) 开发环境的安装
- Python安装模块
- 数据绑定应当注意的一个白痴问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 移植新内核到Linux系统上的操作步骤
- PHP实现简单的协程任务调度demo示例
- YII2.0框架行为(Behavior)深入详解
- php数组函数array_push()、array_pop()及array_shift()简单用法示例
- PHP+MySQL+sphinx+scws实现全文检索功能详解
- php封装的page分页类完整实例代码
- Thinkphp自定义生成缩略图尺寸的方法
- Yii框架中使用PHPExcel的方法分析
- 详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
- Laravel框架自定义分页样式操作示例
- 使用composer 安装 laravel框架的方法图文详解
- laravel5.6 框架操作数据 Eloquent ORM用法示例
- Python版名片管理系统
- docker-compose部署php项目实例详解
- Linux下通过sed命令对kv方式的配置文件进行修改