- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
spring单例模式的问题
Spring有关单例模式的问题
另外补充说一句,单例模式是spring推荐的配置,它在高并发下能极大的节省资源,提高服务抗压能力。spring?IOC的bean管理器是“绝对的线程安全”。用ThreadLocal是为了保证线程安全,实际上ThreadLoacal的key就是当前线程的Thread实例。单例模式下,spring把每个线程可能存在线程安全问题的参数值放进了ThreadLocal。这样虽然是一个实例在操作,但是不同线程下的数据互相之间都是隔离的,因为运行时创建和销毁的bean大大减少了,所以大多数场景下这种方式对内存资源的消耗较少,而且并发越高优势越明显。Spring MVC Controller默认是单例的:
单例的原因有二:
1、为了性能。
2、不需要多例。
1、这个不用废话了,单例不用每次都new,当然快了。
2、不需要实例会让很多人迷惑,因为spring mvc官方也没明确说不可以多例。
? 我这里说不需要的原因是看开发者怎么用了,如果你给controller中定义很多的属性,那么单例肯定会出现竞争访问了。
? 因此,只要controller中不定义属性,那么单例完全是安全的。下面给个例子说明下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 package com.lavasoft.demo.web.controller.lsh.ch5;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
/**
?* Created by Administrator on 14-4-9.
?*
?* @author leizhimin 14-4-9 上午10:55
?*/
@Controller
@RequestMapping(/demo/lsh/ch5)
@Scope(prototype)
public class MultViewController {
????private static int st = 0;????? //静态的
????private int index = 0;????????? //非静态
????@RequestMapping(/show)
????public String toShow(ModelMap model) {
????????User user = new User();
????????user.setUserName(testuname);
????????user.setAge(23);
????????model.put(user, user);
????????return /lsh/ch5/show;
????}
????@RequestMapping(/test)
????public String test() {
????????System.out.println(st++ + | + index++);
????????return /lsh/ch5/test;
????}
}
0 | 0
1 | 1
2 | 2
3 | 3
4 | 4
改为单例的:
0 | 0
1 | 0
2 | 0
3 | 0
4 | 0
从此可见,单例是不安全的,会导致属性重复使用。
最佳实践:
1、不要在controller中定义成员变量。
2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope(prototype),将其设置为多例模式。
Action层次的代码 如果需要用spring 代理的话 最好还是设置为多实例模式,单例模式 可能会导致并发后数据异常bean的作用域设为prototyp只改action的,话说用spring mvc多好,struts2就是多了个线程安全(一般情况都用不到),没啥了,还多了那么多jar包。Bean默认的是单例的.
如果不想单例需要如下配置:bean id=user class=... singleton=false/
singleton就是配置这个bean是否是单例的,如果不写,就是默认值true。
?
注解:
spring Bean生命周期
1.Bean的作用域可以通过Bean标签的scope属性进行设置,Bean的作用域包括:默认情
您可能关注的文档
- Bean标签库.doc
- 天线性能的主要参数有.doc
- 软件开发基础(Java)期末考试试卷(A卷)-2012.6.doc
- polar bear 英文教案.doc
- 地球概论实验结论和心得.doc
- 认知词汇17.doc
- 高考生物复习要点总结3.doc
- google Earth基站图层的制作.doc
- 2014高考生物必考知识点:生物的新陈代谢.doc
- 2014年高考英语重庆卷阅读理解C篇原文.doc
- 化学-瑞大叔清北讲汇.pdf
- 急诊抢救设备管理制度 .ppt
- 2025至2031年中国站绵羊行业投资前景及策略咨询研究报告.docx
- 中国船用便携式冰箱行业市场占有率及投资前景预测分析报告.pdf
- 人工智能应用基础 习题及答案汇总 周朕 项目1--16 .docx
- 2025至2031年中国童装羽绒服行业投资前景及策略咨询研究报告.docx
- 人工智能应用基础 习题及答案汇总 周朕 项目1--8.docx
- 人工智能应用基础 习题及答案汇总 周朕 项目9--16 .docx
- 《登岳阳楼》《桂枝香金陵怀古》联读赏析课件.pptx
- 2025至2031年中国端面磨刀机行业投资前景及策略咨询研究报告.docx
文档评论(0)