Spring学习(二)--- Bean 作用域
概述
本文介绍的Spring 中bean的作用域。
问题 :
- bean的作用域有几种,有那些应用场景
bean 装配过程
下图为bean在容器中从创建到销毁的若干阶段。

bean 作用域
作用域介绍
下面的表格显示的就是bean的作用域,其中单例模式(singleton)下是bean 默认的作用域;prototype 确定一个类,衍生出多个实例。request 和 session 和 http 请求有关;application 的作用域和 ServletContext 有关。

下面展示的是 singleton 和 prototype 两种作用域的示意图。

singleton

prototype
为bean指定作用域
下面是两种方式为bean指定了作用域。
//假如你使用组件扫描发现和声明 bean
@Component
@Scope(ConfigurationBeanFactory.SCOPE_PROTOTYPE)
public class {
....
} <!--使用XML 的方式就像下面所示-->
<bean id="notepad"
class="com.myapp.Notpad"
scope="prototype"
/>
作用域的bean 作为依赖
singleton 和 prototype 作用域的bean 注入到另外的 bean 时不需要使用代理,而request,session 和自定义作用域的bean
作为依赖时需要使用代理。
下面以“购物-购物车”为应用场景为例子。
有一个bean代表用户的购物车。 如果购物车是单例的话, 那么将会导致所有的用户都会向同一个购物车中添加商品。 另一方
面, 如果购物车是原型作用域的, 那么在应用中某一个地方往购物车中添加商品, 在应用的另外一个地方可能就不可用了, 因为在这里
注入的是另外一个原型作用域的购物车。
假设我们要将ShoppingCart bean注入到单例StoreService bean的Setter方法中, 如下所示 :
@Component
public class StoreService{ @Autowired
public void setShoppingCard(ShopperingCar car){
this.shopperingcar = car;
}
}
我们的购物车bean作用域已经确定是 session 的,而StoreService 作用域是 singleton
//购物车bean
@Component
@Scope(value = WebApplicationContext.SCOPE_SESSION,
proxyMode = ScopeProxyMode.INTERFACES)
public ShopperingCart cart(){
...
}
可以看到我们发的Scope 注解中出现了一个 proxyMode 的属性,下面解释一下使用这个属性的原因 :
因为StoreService是一个单例的bean, 会在Spring应用上下文加载的时候创建。 当它创建的时候, Spring会试图将ShoppingCart bean注入到 setShoppingCart() 方法中。 但是ShoppingCart bean是会话作用域的, 此时并不存在。 直到某个用户进入系统, 创建了会话之后, 才会出现ShoppingCart实例。
另外, 系统中将会有多个 ShoppingCart 实例: 每个用户一个。 我们并不想让Spring注入某个固定的 ShoppingCart 实例到StoreService 中。 我们希望的是当 StoreService 处理购物车功能时, 它所使用的 ShoppingCart 实例恰好是当前会话所对应的那一个。Spring并不会将实际的 ShoppingCart bean 注入到 StoreService 中, Spring会注入一个到 ShoppingCart bean 的代理, 下图所示。 这个代理会暴露与 ShoppingCart 相同的方法, 所以 StoreService会认为它就是一个购物车。 但是, 当StoreService调用 ShoppingCart 的方法时, 代理会对其进行懒解析并将调用委托给会话作用域内真正的ShoppingCart bean。
需要注意的是如果ShoppingCart是一个具体的类的话, Spring就没有办法创建基于接口的代理了。 此时, 它必须使用CGLib来生成基于类的代理。 所以, 如果bean类型是具体类的话, 我们必须要将 proxyMode 属性设置为 ScopedProxyMode.TARGET_CLASS, 以此来表明要以生成目标类扩展的方式创建代理。

下面我们看一下XML 方式的装配 :
<bean id = "card" class="com.myapp.ShoppingCart" scop="session">
<aop:scope-proxy proxy-target-class = "false">
</bean>
注意XML文件需要添加 aop 的命名空间。
参考资料
- 《Spring in Action》
- spring.io doc
Spring学习(二)--- Bean 作用域的更多相关文章
- spring 学习之 bean 的注入方式 property和constructor-arg的使用方式
spring 学习之 bean 的注入方式 property和constructor-arg的使用方式. bean的注入方式: property 注入是: 通过setxx方法注入. construct ...
- Spring入门(3)-Spring命名空间与Bean作用域
Spring入门(3)-Spring命名空间与Bean作用域 这篇文章主要介绍Spring的命名空间和Bean作用域 0. 目录 Spring命名空间 Bean作用域 1. Spring命名空间 在前 ...
- Spring 学习笔记 Bean的作用域
在配置文件中定义Bean时,用户不但可以配置Bean的属性值以及相互之间的依赖关系,还可以定义Bean的作用域.作用域将对Bean的生命周期和创建方式产生影响.在低版本的Spring中,仅有两个作用域 ...
- Spring学习(二):Spring支持的5种Bean Scope
序言 Scope是定义Spring如何创建bean的实例的.Spring容器最初提供了两种bean的scope类型:singleton和prototype,但发布2.0以后,又引入了另外三种scope ...
- Spring学习(二)--装配Bean
一.Spring装配机制 Spring提供了三种主要的装配机制: 1.在XML中进行显示配置 2.在Java中进行显示配置 3.隐式的bean发现机制和自动装配--自动化装配bean Spring可以 ...
- Spring学习二:Spring Bean 定义
Bean 定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的.bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象.这些 bean 是 ...
- Spring IOC 之Bean作用域
当你创建一个bean定义的时候,你创建了一份通过那种bean定义的bean的创建类的真正实力的处方.bean的定义是一个处方 的想法是很重要的的.因为这意味着,对于一个类你可以创建很多对象实例从一个单 ...
- Spring系列(二) Bean装配
创建应用对象之间协作关系的行为称为装配(wiring), 这也是DI的本质. Spring中装配Bean的方式 Spring提供了三种装配Bean的方式. 隐式的Bean发现机制和自动装配 Java ...
- Spring之配置文件bean作用域的详细介绍
Spring的配置文件applicationContext.xml中bean作用域的详细介绍: 1:对象的创建:单例和多例 scope="singleton",默认值 ...
- Spring 学习之bean的理解
前言:对于使用Spring框架的开发人员来说,我们主要做的主要有两件事情:①开发Bean;②配置Bean;而Spring帮我们做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法来完成“依 ...
随机推荐
- Android App的破解技术有哪些?如何防止反编译?
现在最流行的App破解技术大多是基于一定相关技术的基础:如一定阅读Java代码的能力.有一些Android基础.会使用eclipse的一些Android调试的相关工具以及了解一些smali的语法规范 ...
- k8s 常用指令
kubectl rolling-update redis-master --image=redis-master:2.0 基于镜像灰度发布 推荐链接
- 【vim】简介与基本配置
vim是一款非常强大的文字编辑软件,是各种类UNIX系统标配的文本编辑工具.相信此文的读者对它应该不会陌生,在这里就不做介绍了. 1.为什么要使用vim 在认识vim之前,我用过好多IDE:Visua ...
- Eclipse中创建SpringBoot项目流程,及报错解决方案
1.下载最新的Eclipse(老版本的有可能不包含springBoot插件),然后在help中打开Eclipse MarketPlace,在Spring Marketplace 中搜索SpringBo ...
- leetcode-79-单词搜索(用dfs解决)
题目描述: 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许 ...
- 为阿里云域名配置免费SSL支持https加密访问简单教程
阿里云之前有免费ssl入口申请,现在已经关闭了.那么现在怎么为自己的域名配置https呢? 首先打开阿里云域名控制台,如以下界面.(这里暂且用我的这个域名讲解吧) 如上图点击ssl证书,点击单域名免 ...
- CodeForces - 556C-Case of Matryoshkas(思维)
Andrewid the Android is a galaxy-famous detective. He is now investigating the case of vandalism at ...
- js实现瀑布流布局
window.onload = function () { var d1 = new Waterfall(); d1.init();};//构造函数function Waterfall() { thi ...
- 没事用html5 canvas画一个仪表盘自用,自适应的哦
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 深度学习(七)U-Net原理以及keras代码实现医学图像眼球血管分割
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9780786.html DRIVE数据集下载百度云链接:链接:https://pan.baidu ...