Spring Bean Scope 有状态的Bean 无状态的Bean
在Spring的Bean配置中,存在这样两种情况:
- <bean id="testManager" class="com.sw.TestManagerImpl" scope="singleton" />
- <bean id="testManager" class="com.sw.TestManagerImpl" scope="prototype" />
当然,scope的值不止这两种,还包括了request,session 等。但用的最多的还是singleton单态,prototype多态。
singleton表示该bean全局只有一个实例,Spring中bean的scope默认也是singleton.
prototype表示该bean在每次被注入的时候,都要重新创建一个实例,这种情况适用于有状态的Bean.
对于SSH架构的系统,很少关心这方面,因为我们用到的一般都是singleton. Bean的注入由Spring管理。
对于有状态的Bean呢?
下面是一个有状态的Bean
- package com.sw;
- public class TestManagerImpl implements TestManager{
- private User user;
- public void deleteUser(User e) throws Exception {
- user = e ; //1
- prepareData(e);
- }
- public void prepareData(User e) throws Exception {
- user = getUserByID(e.getId()); //2
- .....
- //使用user.getId(); //3
- .....
- .....
- }
- }
如果该Bean配置为singleton,会出现什么样的状况呢?
如果有2个用户访问,都调用到了该Bean.
假定为user1,user2
当user1 调用到程序中的1步骤的时候,该Bean的私有变量user被付值为user1
当user1的程序走到2步骤的时候,该Bean的私有变量user被重新付值为user1_create
理想的状况,当user1走到3步骤的时候,私有变量user应该为user1_create;
但如果在user1调用到3步骤之前,user2开始运行到了1步骤了,由于单态的资源共享,则私有变量user被修改为user2
这种情况下,user1的步骤3用到的user.getId()实际用到是user2的对象。
而如果是prototype的话,就不会出现资源共享的问题。
对于SSH来说,Bean的配置是没错的,配置为singleton ;实际应该是这个例子不应该用私有变量。这样就使得这个Bean
由无状态变成了有状态Bean.还是应该尽量使用无状态Bean.如果在程序中出现私有变量,尽量替换为参数。
对于每个访问私有变量的方法增加变量传入或者通过ThreadLocal来获取也是不错的方法。
真正出现上面代码问题的也是少数,出现的时候,一般是为了图方便,一个很多方法都要用到的变量,如果都需要用参数的
方式传递多麻烦呀,这样私有变量多好,不用参数那样丑陋。但是丑陋并不代表不好,以对的,自己习惯的方式编程,才能
尽量避免问题的发生。
转载于:https://www.cnblogs.com/happyday56/p/5566945.html
Spring Bean Scope 有状态的Bean 无状态的Bean相关推荐
- 【转】多线程之有状态对象和无状态对象
有状态对象和无状态对象 参考:https://www.cnblogs.com/xubiao/p/6567349.html 一. 基本概念 1. 什么是有状态对象 有状态对象指的是有数据存储功能的类的对 ...
- stateless java_有状态(Stateful)与无状态(Stateless)
1.有状态(Stateful): 有数据存储功能.有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,类里面有成员变量,而且成员变量是可变的,是非线程安全的.在不同方法调用间 ...
- 「小程序JAVA实战」java-sesion的状态会话与无状态会话(38)
转自:https://idig8.com/2018/09/02/xiaochengxujavashizhanjava-sesiondezhuangtaihuihuayuwuzhuangtaihuihu ...
- mysql有状态无状态_k8s statefulSet 有状态应用和无状态应用区别
一.定义: 无状态服务:就是没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息) 有状态服务 ...
- 状态服务器与无状态服务器(要点)
对服务器程序来说,究竟是有状态服务,还是无状态服务,其判断依旧是指两个来自相同发起者的请求在服务器端是否具备上下文关系.如果是状态化请求,那么服务器端一般都要保存请求的相关信息,每个请求可以默认地使用 ...
- 关于drools有状态会话和无状态会话到底有何区别的看法
关于有状态会话和无状态的会话的区别,很多人不能真正理解,小哥也不是很理解,但也有些看法,以下是官网翻译而来 一.有状态会话常见用例: 1. 监测 半自动买入股票市场监控与分析. 2. 诊断 故障查 ...
- 有状态服务和无状态服务
概念 服务一般分为有状态服务(Stateful Service)和无状态服务(Stateless Service).它们的区别是,当请求发起后,服务在服务端运行时是否需要关联上下文. 有状态服务,服务 ...
- 有状态服务和无状态服务的区别
有状态服务和无状态服务的区别 有状态和无状态服务是两种不同的服务架构,两者的不同之处在于对于服务状态的处理.服务状态是服务请求所需的数据,它可以是一个变量或者一个数据结构.无状态服务不会记录服务状态, ...
- spring 中属性scope 的prototype(有状态)和singleton(无状态)
默认情况下,从bean工厂所取得的实例为Singleton(bean的singleton属性) Singleton: Spring容器只存在一个共享的bean实例, 默认的配置. Prototype: ...
- 无状态逻辑服务器,无状态 | RESTful API 中文网
无状态 根据REST(REpresentational "State" Transfer)体系结构,服务器不会在服务器端存储有关客户端会话的任何状态.这种限制称为无状态.从客户端到 ...
最新文章
- luogu P3306 [SDOI2013] 随机数生成器(BSGS,数列求通项,毒瘤特判)
- hpgen9服务器f10没显示,hp gen9服务器设置
- NYOJ 453 小珂的烦恼
- [Android Studio] Android Studio如何查看branch列表及切换branch(转载)
- java分数表示_表示Java分数的最佳方法?
- 单表置换密码java代码实现_单表替换密码
- windows服务器nginx日志分割
- 【软件笔记------Orcad Capture CIS 17.2/pads vx2.7】------ orcadpads PCB设计简要教程
- 防范蠕虫式勒索软件病毒***的安全预警通告
- Mybatis插入大量数据效率对比:foreach插入、SqlSession批量插入、sql插入
- Namecheap 给域名添加ssl证书
- 《UnityAPI.Color颜色》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+Color+Lerp+RGBToHSV+gamma+linear+立钻哥哥++OK++)
- IOS开发之协议和代理
- 2018年总结,踩踩这条即将溜掉的狗尾巴 ~
- 人工智能截稿日期重磅
- 阿里云大数据ACA总结
- 【品牌DTC增长力】私域,你做的可能是“假的”
- 子集和问题 算法_LeetCode 题解 | 78.子集
- java 判断 子集_java – 获取集合子集的策略
- linux界面赶不上微软,忘掉微软!其实Linux桌面也能如此美
热门文章
- 基于linux的集群系统LVS
- 3.12PMP试题每日一题
- 关于java中BufferedReader的read()及readLine()方法的使用心得
- qt-embedded-linux-opensource-src-4.5.3移植到s3c6410
- 伯纳德•罗森伯格先生参加华为技术2016首届国际光电连接技术研讨会
- css预处理器sass使用教程(多图预警)
- eclipse3.4 SVN插件安装
- 【Android Studio】分类整理res/Layouts中的布局文件(创建子目录)
- Windows 下查看端口占用情况 netstat / tasklist / findstr
- HTML入门学习 -- HTML基础知识