Spring Bean Scope 有状态的Bean 无状态的Bean

 在Spring的Bean配置中,存在这样两种情况:

[xhtml] view plaincopy
  1. <bean id="testManager" class="com.sw.TestManagerImpl" scope="singleton" />  
  2.   
  3.  <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

 

[java] view plaincopy
  1. package com.sw;  
  2.   
  3. public class TestManagerImpl implements TestManager{  
  4.     private User user;    
  5.   
  6.     public void deleteUser(User e) throws Exception {  
  7.         user = e ;           //1  
  8.         prepareData(e);  
  9.     }  
  10.   
  11.     public void prepareData(User e) throws Exception {  
  12.         user = getUserByID(e.getId());            //2  
  13.         .....  
  14.         //使用user.getId();                       //3  
  15.         .....  
  16.         .....  
  17.     }     
  18. }  

 

 

如果该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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构基础:图结构的学习笔记

1、图的定义图是比树更加复杂的数据结构&#xff0c;在图的结构当中&#xff0c;任意两个节点之间都有可能有直接关系&#xff0c;所以图中一个节点的前驱和后继的数目是没有限制的。2、图的用途用于描述各种复杂的数据对象&#xff0c;在自然科学、社会科学和人文科学等很多领…

企业网站 源码 服务邮箱:_企业网站建设对于服务器的选择至关重要

网站建设是离不开租用服务器的&#xff0c;这是目前大多数企业都在做的。但有些企业由于对网站服务器的租用技巧及经验的缺乏&#xff0c;经常会导致网站在运营过程中出现非常多的问题&#xff0c;严重影响了企业业务的正常开展。石家庄网站建设方面的人才来说明几点不容忽视的…

linux sli 提高效率,从原理到性能提升 MCP78智能SLI全解析

NVIDIA正式发布了“Hbrid SLI”技术在昨日的2008 CES上&#xff0c;NVIDIA正式向外界发布了“Hbrid SLI”技术&#xff0c;即我们所俗称的混合SLI&#xff0c;而NVIDIA在发布时已更正式名为“智能SLI技术”。虽然这仅仅是NVIDIA在此次消费电子展上的宣讲主题之一&#xff0c;但…

git操作代码文件的颜色变化

1.若文件显示红色&#xff0c;表示文件未add到git进行管理 2.若文件显示绿色&#xff0c;表示文件已经交给git管理&#xff0c;但从未上传到远程仓库中 3.若文件显示蓝色&#xff0c;表示文件已经上传过远程仓库&#xff0c;且此时本地文件与远程仓库文件不一致 4.若文件显示…

[GitHub]第三讲:简单分支操作

Git 最核心的操作对象是版本&#xff08; commit &#xff09;&#xff0c;最核心的操作技巧就是分支。 什么是分支&#xff1f; 仓库创建后&#xff0c;一旦有了新 commit&#xff0c;默认就会放到一个分支上&#xff0c;名字叫 master。前面咱们一直看到的多个版本组成的一条…

算法基础:常用的排序算法知识笔记

1、算法外排序分类2、冒泡排序冒泡排序&#xff08;Bubble Sort&#xff09;属于交换排序&#xff0c;它的原理是&#xff1a;循环两两比较相邻的记录&#xff0c;如果反序则交换&#xff0c;直到没有反序的记录为止。实现算法&#xff1a;/*** 冒泡排序优化后的算法* 设置一个…

302状态码_http状态码是什么?301 302 404的SEO应用场景

什么是HTTP状态码&#xff1f;简单的讲&#xff0c;就是用以表示网页服务器HTTP响应状态的3位数字代码。其中1xx表示临时响应&#xff0c;2xx表示成功处理了请求&#xff0c;3xx代表重定向&#xff0c;4xx表示请求错误&#xff0c;而5xx表示服务器错误。除了网页正常返回200之外…

Android高版本开机广播,android3.1以上,假如程序没有启动过,怎么获取开机广播呢?...

官方说不支持&#xff1a;Launch controlson stopped applicationsStarting from Android 3.1, the systems package manager keepstrack of applications that are in a stopped state and provides ameans of controlling their launch from background processes andother a…

git push前请先git pull

开发过程中 如果要推送代码到远程仓库&#xff0c;请先git pull。养成好习惯。 原因很简单&#xff0c;在你开发过程中&#xff0c;你的同事可能也在改代码然后他提交了没通知你&#xff0c;你直接git push很容易造成代码冲突&#xff0c;代码冲突解决也简单&#xff0c;可万一…

table 中 thead tbody tfoot 加载顺序问题

这几个标记主要是用于提高table标签的加载以及显示的&#xff0c;说白了&#xff0c;就是分布加载。在传统的浏览器&#xff0c;在加载 时&#xff0c;是当所有的标签中元素都被下载后才会显示&#xff0c;当然这样的用户体验是不好的。再加入了这几个t打头的标签后&#xff0c…

算法基础:常用的查找算法知识笔记

1、查找表和查找效率的概念查找表是指由同一类型的数据元素构成的集合。分为静态查找表和动态查找表。1.1 静态查找表1、查询某个特定元素是否在查找表的集合当中2、查询某个特定元素的各种属性1.2 动态查找表1、在查找表中插入一个数据元素2、在查找表中删除一个元素1.3 关键字…

注解参数怎么使用变量_硅橡胶胶水有哪些特点?使用参数表现的怎么样?如何储存?...

作为单组分产品&#xff0c;硅橡胶胶水的使用方法简单又灵活。直接涂抹在粘接基面上&#xff0c;固化之后即可抵抗外界的压力与冲击。别看它的规格不是很打&#xff0c;却可以顺顺利利完成粘接&#xff0c;形成保护膜。硅橡胶胶水有哪些特点?没有固化之前&#xff0c;是半透明…

android 谷歌邮箱,Android 使用 SMTP 发送邮件 (Gmail)

具体使用方法请看&#xff1a;http://www.oschina.net/code/snippet_12_9831.[代码]GMailSender.javapackage org.apache.android.mail;import javax.activation.DataHandler;import javax.activation.DataSource;import javax.mail.Message;import javax.mail.PasswordAuthent…

Java中return的两种用法

一、return语句总是用在方法中&#xff0c;有两个作用。 一个是返回方法指定类型的值&#xff08;这个值总是确定的&#xff09;。 一个是结束方法的执行&#xff08;仅仅一个return语句&#xff09;。 一般的就百是用在有反回值的方法中&#xff0c;用来返回方度法指定问类…

Alpha版总结会议

一、会议过程 我们于第十五周周一开始在学院楼针对前一段时间开发过程中的问题进行了讨论。会议期间我们整合并回顾了一下两次冲刺周期的成果。会议开始首先每个人都先发表了自己针对Alpha版开发过程中存在的疑惑和一些问题的看法。我们最后挑选出出三个最具针对性的问题进行了…

算法基础:递归算法知识笔记

1、递归算法定义递归算法是将重复问题分解为同类的子问题而解决问题的方法&#xff0c;其核心思想是分治策略。简单来说就是自己调用自己。直到达到退出递归的条件&#xff0c;则完成递归。2、递归的步骤1、找整个递归的终止条件&#xff1a;递归应该在什么时候结束&#xff1f…

ttl继承逻辑门的逻辑功能与参数测试 实验总结_LMS电声测试仪,LMS-V测试系统,精声电声...

LMS-V测试系统LMS扬声器测试仪从推出到现在25年的时间&#xff0c;在全世界被很多扬声器开发与制造厂家广泛应用研发与生产质量控制&#xff0c;传统的LMS扬声器测试仪采用ISA卡的形式提供&#xff0c;所以面临着越来越多的零件过时&#xff0c;所以为了彻底解决这些问题&#…

android自动让输入框上划,Android界面技巧:当输入法调出时,如何让界面自动上移,使输入法不会遮挡到主界面(Activity)...

android:windowSoftInputModeactivity主窗口与软键盘的交互模式&#xff0c;可以用来避免输入法面板遮挡问题&#xff0c;Android1.5后的一个新特性。这个属性能影响两件事情&#xff1a;【一】当有焦点产生时&#xff0c;软键盘是隐藏还是显示【二】是否减少活动主窗口大小以便…

java中break标记的使用

笔试题目&#xff1a;break目前位于内层的for循环&#xff0c;如何才能让break作用于外层 的for循环。可以标记解决 标记的命名只要符合标识符的命名规则即可。 Test public void test2(){aaa:for(int j 0 ; j<3 ; j){ // j0 外层for循环for(int i 0 ; i< 2 ; i){ //…

六月计划#2B(6.10-6.16)

4/7 STL set 数学 快速傅立叶(FFT)高斯消元动态规划 斜率优化转载于:https://www.cnblogs.com/Sunnie69/p/5573299.html