笔记5 bean的作用域
1. Spring定义了多种作用域,可以基于这些作用域创建bean,包括:
- 单例(Singleton):在整个应用中,只创建bean的一个实例。(默认)
- 原型(Prototype):每次注入或者通过Spring应用上下文获取的 时候,都会创建一个新的bean实例。
<1>如果使用组件扫描来发现和声明bean,那么可以在bean的 类上使用@Scope注解,将其声明为原型bean:
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE )或者@Scope("prototype")
<2>如果想在Java配置中声明原型bean,那么可以组合使 用@Scope和@Bean来指定所需的作用域。
<3>如果使用XML来配置bean的话,可以使用<bean>元素的 scope属性来设置作用域
- 会话(Session):在Web应用中,为每个会话创建一个bean实例。
- 请求(Request): 在Web应用中,为每个请求创建一个bean实例。
购物车bean设置为会话作用域,使用@Scope注解:@Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode=ScopedProxyMode.INTERFACES)
电子商务应用中,当用户进入系统后,创建了相应的会话后,购物车实例才会产生,而且系统中会有多个购物车的实例,每个用户一个。系统中还有一个专门处理购物车的实例StoreService(将购物车对象传入,然后进行处理),它是一个单例的bean,会在Spring应用上下文加载的时候创建。这时会产生一个问题,当创建这个StoreServices时,Spring会试图将购物车bean注入到StoreService中,但此时购物车bean是会话作用域的,此时并不存在。所以,期望是当StoreService处理购物车功能时,它所使用的购物车实例恰好时当前会话所对应的那一个。Spring并不会将实际的购物车bean注入到StoreService中, Spring会注入一个到购物车 bean的代理,。这个代理会暴露与购物车bean相同的方法,所以StoreService 会认为它就是一个购物车。但是,当StoreService调 用购物车的方法时,代理会对其进行懒解析并将调用委托 给会话作用域内真正的购物车 bean。
proxyMode属性被设置成了 ScopedProxyMode.INTERFACES,这表明这个代理要实现 购物车的接口,并将调用委托给实现bean。如果购物车类是接口而不是类的话,这是可以的(也是最为 理想的代理模式)。但如果购物车类是一个具体的类的话, Spring就没有办法创建基于接口的代理了。此时,它必须使用CGLib 来生成基于类的代理。所以,如果bean类型是具体类的话,我们必须要将proxyMode属性设置为ScopedProxyMode.TARGET_CLASS,以此来表明要以生成目标 类扩展的方式创建代理。
请求作用域的bean应该也以作用域代理的方式进行注入。
如果需要使用XML来声明会话或请求作用域的bean,那么就不能使 用@Scope注解及其proxyMode属性了,要使用<aop:scoped-proxy>。

<aop:scoped-proxy>是与@Scope注解的proxyMode属性功能相 同的Spring XML配置元素。它会告诉Spring为bean创建一个作用域代理。默认情况下,它会使用CGLib创建目标类的代理。但是我们也可 以将proxy-target-class属性设置为false,进而要求它生成基 于接口的代理:
<为了使用<aop:scoped-proxy>元素,我们必须在XML配置中声明 Spring的aop命名空间>


笔记5 bean的作用域的更多相关文章
- [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring4学习笔记 - 配置Bean - 自动装配 关系 作用域 引用外部属性文件
1 Autowire自动装配 1.1 使用:只需在<bean>中使用autowire元素 <bean id="student" class="com.k ...
- Spring 学习笔记 Bean的作用域
在配置文件中定义Bean时,用户不但可以配置Bean的属性值以及相互之间的依赖关系,还可以定义Bean的作用域.作用域将对Bean的生命周期和创建方式产生影响.在低版本的Spring中,仅有两个作用域 ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring中Bean的作用域
作用域的种类 Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域.Spring3 为 Bean 定义了五种作用域,具体如下. 1)singleton 单例模式,使用 sing ...
- 浅析Spring中bean的作用域
一.前言 刚刚花了点时间,阅读了一下Spring官方文档中,关于bean的作用域这一块的内容.Spring-4.3.21官方文档中,共介绍了七种bean作用域,这篇博客就来简单介绍一下这七种作用域 ...
- Spring中Bean的作用域、生命周期
Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...
- Spring bean的作用域和生命周期
bean的作用域 1.singleton,prototype, web环境下:request,session,gloab session 2.通过scope="" 来进行配置 3. ...
- Bean 的作用域
•在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域. 默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实 ...
- Spring学习笔记—装配Bean
在Spring中,对象无需自己负责查找或创建与其关联的其他对象.相反,容器负责把需要相互协作的对象引用赋予各个对象.创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入的本质. ...
随机推荐
- Scala 对象
1. 单例对象 对于任何你在Java中会使用单例对象的地方, 在scala中都可以使用对象来实现; scala字段没有静态方法或者静态字段, 可以使用object语法结构达到同样的效果,对象(obje ...
- [JCIP笔记] (三)如何设计一个线程安全的对象
在当我们谈论线程安全时,我们在谈论什么中,我们讨论了怎样通过Java的synchronize机制去避免几个线程同时访问一个变量时发生问题.忧国忧民的Brian Goetz大神在多年的开发过程中,也悟到 ...
- python django的ManyToMany简述
Django的多对多关系 在Django的关系中,有一对一,一对多,多对多的关系 我们这里谈的是多对多的关系 ==我们首先来设计一个用于示例的表结构== # -*- coding: utf-8 -*- ...
- 分布式系统之消息中间件rabbitmq
分布式系统之消息中间件rabbitmq 博客分类: 感谢: 一般php 用rabbitmq java 用activemq http://spartan1.iteye.com/blog/11802 ...
- java排序算法之冒泡排序(Bubble Sort)
java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...
- RESTful API 编写指南
基于一些不错的RESTful开发组件,可以快速的开发出不错的RESTful API,但如果不了解开发规范的.健壮的RESTful API的基本面,即便优秀的RESTful开发组件摆在面前,也无法很好的 ...
- kubernetes进阶(01)kubernetes的namespace
一.Namespace概念 Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组. 常见的pods, services, replication co ...
- 新概念英语(1-125)Tea for two
Does Susan have tea by herself?A:Can't you come in and have tea now,Peter? Not yet.B:I must water th ...
- git初试
在gitLab上新建一个项目,creat项目文件之后,进入到项目的路径之后,复制命令git clone ‘git@gitlab.touzila.com:xiacaixiang/gitgitTest1. ...
- Linux平台部署.Net Core SDK
根据微软MSDN,.Net Core无论是1.x还是2.0都只支持64位系统. 准备 以下是.NetCore支持的系统版本 以下 Linux 64 位(x86_64 或 amd64)发行版本/版本支持 ...