struts2,springmvc,servlet 单多例问题
2017-01-03 02:43
141 查看
struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象。原因是:struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。所以Struts2的Action是多例模式的。
Spring的bean可以针对每一个设置它的scope,所以,上面的问题就不是问题了。如果用多例,就在spring的action bean配置的时候设置scope="prototype"
springmvc controller默认的是单例singleton的,具体可以查看注解scope可以一目了然。
单例的原因有二:
1、为了性能。
2、不需要多例。
1、这个不用废话了,单例不用每次都new,当然快了。
2、不需要实例会让很多人迷惑,因为spring mvc官方也没明确说不可以多例。
我这里说不需要的原因是看开发者怎么用了,如果你给controller中定义很多的属性,那么单例肯定会出现竞争访问了。
@Controller
@RequestMapping("/demo")public class MultViewController {
private static int st = 0; //静态的
private int index = 0; //非静态
@RequestMapping("/test")
public void test() {
System.out.println(st++ + " | " + index++);
}
}
默认单例的,随着请求次数的增加:
0 | 0
1 | 1
2 | 2
3 | 3
4 | 4
...
controller增加注解:
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
此时,无论多少次请求,结果为:
0 | 0
1 | 0
2 | 0
3 | 0
4 | 0
...
从以上很容易看出,单例是线程不安全的,会导致属性的重复性利用。
最佳实践:
1、不要在controller中定义成员变量。
2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope("prototype"),将其设置为多例模式
Spring的bean可以针对每一个设置它的scope,所以,上面的问题就不是问题了。如果用多例,就在spring的action bean配置的时候设置scope="prototype"
springmvc controller默认的是单例singleton的,具体可以查看注解scope可以一目了然。
单例的原因有二:
1、为了性能。
2、不需要多例。
1、这个不用废话了,单例不用每次都new,当然快了。
2、不需要实例会让很多人迷惑,因为spring mvc官方也没明确说不可以多例。
我这里说不需要的原因是看开发者怎么用了,如果你给controller中定义很多的属性,那么单例肯定会出现竞争访问了。
@Controller
@RequestMapping("/demo")public class MultViewController {
private static int st = 0; //静态的
private int index = 0; //非静态
@RequestMapping("/test")
public void test() {
System.out.println(st++ + " | " + index++);
}
}
默认单例的,随着请求次数的增加:
0 | 0
1 | 1
2 | 2
3 | 3
4 | 4
...
controller增加注解:
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
此时,无论多少次请求,结果为:
0 | 0
1 | 0
2 | 0
3 | 0
4 | 0
...
从以上很容易看出,单例是线程不安全的,会导致属性的重复性利用。
最佳实践:
1、不要在controller中定义成员变量。
2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope("prototype"),将其设置为多例模式
相关文章推荐
- struts2,springmvc,servlet 单多例问题
- struts2,servlet和springmvc的单例多例问题
- Struts2学习中 servlet,api的版本问题
- struts/Servlet,action转到jsp后,路径问题(struts2,jsp路径,action路径,action跳转,相对路径,绝对路径)
- struts2和servlet的共存问题
- Servlet、Struts1 和Struts2 线程安全问题总结
- struts2和servlet的共存问题以及解决
- struts2 中使用 servlet遇到的问题
- Struts2和Servlet共用时获取ServletContext对象的问题
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试
- SpringMVC配置servlet.xml的时候出现的问题
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试
- 转载 在Struts2中使用servlet 配置问题
- struts2和servlet的共存问题
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试
- Struts2、SpringMVC、Servlet(Jsp)性能对比测试(转)
- 解决使用struts2后servlet不能正常工作的问题
- struts2和servlet的共存交互问题
- servlet、struts2、springmvc中实现带进度条的文件上传
- servlet、struts1和struts2的线程安全问题