网站大量收购独家精品文档,联系QQ:2885784924

spring单例模式的问题.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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的作用域包括: 默认情

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档