- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
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的作用域包括:默认情
文档评论(0)