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>

第3章—高级装配—bean的作用域的更多相关文章

  1. (三)Spring 高级装配 bean的作用域@Scope

    1.默认情况下,spring通过@Autowared注入的bean是单例的bean,但有些情况是不满足的,例如:购物车,每个会话,或每个用户登录使用的购物车都是独立的 spring的定义的作用域: a ...

  2. Spring高级装配bean

    目录 spring profile 条件化的bean声明 自动装配与歧义性 bean的作用域 Spring表达式语言 一.环境与profile 配置profile  bean 在软件开发的时候,有一个 ...

  3. spring实战第二章小记-装配bean

    时间:2020/02/06 一.思想 1.创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入(DI)的本质. 对于上面这句话的个人理解:当我们在new一个对象时如果传入了别的对象作为参数(这个 ...

  4. 第3章—高级装配—条件化的Bean

    条件化的Bean 通过活动的profile,我们可以获得不同的Bean.Spring 4提供了一个更通用的基于条件的Bean的创建方式,即使用@Conditional注解. @Conditional根 ...

  5. 第3章—高级装配—配置profile bean

    配置profile bean 3.1.@profile注解是spring提供的一个用来标明当前运行环境的注解. 我们正常开发的过程中经常遇到的问题是,开发环境是一套环境,qa测试是一套环境,线上部署又 ...

  6. Spring学习之旅(四)--高级装配Bean

    条件化 bean 有时候我们要满足某种情况才将bean 初始化放入容器中. 基于环境初始化不同的 bean 1.申明接口并创建两个实现类 public interface Teacher { void ...

  7. 《精通Spring4.X企业应用开发实战》读后感第五章(装配Bean,依赖注入)

  8. spring学习总结——高级装配学习三(Bean的作用域)

    一.bean的作用域 在默认情况下,Spring应用上下文中所有bean都是作为以单例(singleton)的形式创建的.也就是说,不管给定的一个bean被注入到其他bean多少次,每次所注入的都是同 ...

  9. [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. Linux 基础教程 34-软件包管理-RPM

        对于Linux而言管理各类软件,如安装.卸载和升级等是常有的事情和必备的技能.以CentOS为例,常用的安装包命令有rpm和yum. RPM基础     RPM(RedHat Package ...

  2. 监控小工具(jconsole)

    偶然发现的一个监控小工具 配置好Jmeter运行的环境,在CMD命令中输入:jconsole 即可弹出一个[java监视和管理控制台]

  3. 洛谷 P1967 货车运输(克鲁斯卡尔重构树)

    题目描述 AAA国有nn n座城市,编号从 11 1到n nn,城市之间有 mmm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qqq 辆货车在运输货物, 司机们想知道每辆车在不超过车 ...

  4. 【StatLearn】统计学习中knn算法的实验(1)

    Problem: Develop a k-NN classifier with Euclidean distance and simple voting Perform 5-fold cross va ...

  5. Oracle Submit Request - 请求的调用方法: FND_REQUEST.SUBMIT_REQUEST

    废话: 有一段时间没搞过开发了,做项目又要重新找回点开发的记忆.重新拾回一点点零碎. 跑多了产线,配置的一些参数也忘记得差不多了,长时间没动就是易遗忘,找点资料做个笔记就是时间保镖.   正题: FN ...

  6. 随笔-未整理-linux下流量查看

    nethogs: 按进程查看流量占用 iptraf: 按连接/端口查看流量 ifstat: 按设备查看流量 ethtool: 诊断工具 tcpdump: 抓包工具 ss: 连接查看工具 其他: dst ...

  7. Sqlserver 密码过期时间查询

    DECLARE @login nvarchar(30) -- 查询设定密码过期的登陆账号SELECT @login = nameFROM sys.sql_loginsWHERE is_expirati ...

  8. ASP.NET Core 2.0 in Docker on Windows Containers

    安装Docker for Windows https://store.docker.com/editions/community/docker-ce-desktop-windows 要想将一个ASP. ...

  9. insert into 的另一种添加插入新行方式

    语法 1 插入一行 insert into table (field1,field2.....) select value1,value2........; 2 插入多行 insert into ta ...

  10. BASE64编码乱码问题的浅层分析与解释

    本文由作者朱臻授权网易云社区发布. 1问题案例 曾在开发过程中,我们遇到了BASE64编码乱码的问题,该问题的场景如下: 当web前端,将带有中文字符的字符串base64编码后,传到后端.当后端将数据 ...