struts2,springmvc,servlet 单多例问题
2017-04-17 00:00
162 查看
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单例和平常说的单例的区别,该死的当时居然回答“不知道”,真白痴啊。
Spring中所谓的单例是指scope="singleton"的bean.
单例模式分为饿汉模式和懒汉模式:
Spring中说的单例是相对于容器的,既在ApplicationContext中是单例的。而平常说的单例是相对于JVM的。另一个JVM可以有多个Spring容器,而且Spring中的单例也只是按bean的id来区分的。
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单例和平常说的单例的区别,该死的当时居然回答“不知道”,真白痴啊。
Spring中所谓的单例是指scope="singleton"的bean.
单例模式分为饿汉模式和懒汉模式:
饿汉模式 | spring singleton的缺省是饿汉模式:启动容器时(即实例化容器时),为所有spring配置文件中定义的bean都生成一个实例 |
懒汉模式 | 在第一个请求时才生成一个实例,以后的请求都调用这个实例 spring singleton设置为懒汉模式:<beans default-lazy-init="true"> |
相关文章推荐
- 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的线程安全问题