欢迎来到天天文库
浏览记录
ID:35478292
大小:59.46 KB
页数:5页
时间:2019-03-25
《spring单例模式的问题》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Spring冇关单例模式的问题另外补充说-句,单例模式是spri隅推荐的配置,它在高并发下能极大的节省资源,提高服务抗压能力。springIOC的bean管理器是"绝对的线程安全〃。用ThreadLocal是为了保证线程安全,实际上ThreadLoacal的key就是当前线程的Thread实例。单例模式下,spri昭把毎个线程可能存在线程安全问题的参数值放进了ThreadLocal。这样虽然是一个实例在操作,但是不同线程下的数据互相之间都是隔离的,因为运行时创建和销毁的bean大大减少了,所以大多数场杲下这种
2、方式对内存资源的消耗较少,而且并发越高优势越明显。SpringMVCController默认是单例的:单例的原因冇二:1、为了性能。2、不需要多例。1、这个不用废话了,单例不用每次都new,当然快了。2、不需要实例会让很多人迷惑,因为springmvc官方也没明确说不可以多例。我这里说不需要的原因是看开发者怎么用了,如果你给controller中定义很多的屈性,那么单例肯定会岀现竞争访问了。因此,只要controller中不定义属性,那么单例完全是安全的。下面给个例子说明下:1packagecom・lavei
3、soft・demo.web・controllcr・lsh・ch5;2importorg・springframework・context・annotation.Scope;3importorg.springframework,stereotype.Controller;4importorg.springframework.ui.ModelMap;5importorg.springframework,web.bind,annotation.RequestMapping;6/**7*CreatedbyAdminis
4、tratoron14-4-9・1*2*@authorleizhimin14-4-9上午10:553*/11@Controller12@RequestMapping("Vdemo/lsh/ch5〃)13@Scopc("prototype")14publicclassMultViewController{15privatestaticintst=0;//静态的16privateintindex二0;//非静态17@RequestMapping("/show")18publicStringtoShow(ModelM
5、apmodel){19Useruser=newUser();20user.setUserName(,ztestuname,z);21user.setAge(〃23〃);22model,put("user",user);23return"/Ish/ch5/show〃;24}25©RequestMapping("/test")26publicStringtest(){27System,out.println(st+++〃
6、〃+index++);28return‘71sh/ch5/test〃;2930}001
7、12
8、
9、23
10、34
11、4改为单例的:00从此可见,单例是不安全的,会导致屈性重复使用。最佳实践:1、不要在controller中定义成员变量。2、万一必须要定义一个非静态成员变量吋候,则通过注解@Scope("prototype"),将其设置为多例模式。Action层次的代码如果需要用spring代理的话最好述是设置为多实例模式,单例模式可能会导致并发后数据异常。bean的作用域设为prototyp。只改action的,话说用springmvc多好,struts2就是多了个线程安全(一般情况都用不到),没啥了,还多了
12、那么多jH包。Bean默认的是单例的.如果不想单例需要如下配置:13、例;scope二〃request",在WEB应用程序中,每一个实例的作用域都为request范围;scope二〃session",在WEB应用程序中,每一个实例的作用域都为session范围;注意:在默认情况下,Bean实例在被Spring容器初始化的时候,就会被实例化,默认调用无参数的构造方法。在其它情况下,Bean将会在获取实例的时候才会被实例化。2.Bean可以通过指定屈性init-mctho
13、例;scope二〃request",在WEB应用程序中,每一个实例的作用域都为request范围;scope二〃session",在WEB应用程序中,每一个实例的作用域都为session范围;注意:在默认情况下,Bean实例在被Spring容器初始化的时候,就会被实例化,默认调用无参数的构造方法。在其它情况下,Bean将会在获取实例的时候才会被实例化。2.Bean可以通过指定屈性init-mctho
此文档下载收益归作者所有