1.springMVC默认是单例的
对于同一个Controller,只会生成一个实例来处理所有的请求,因此bean实例只会实例化一次,并被存放在工厂中,以供其他请求使用。
在不定义成员变量的情况下是线程安全的。
单例的优点:
1)每次请求不需要重新new一个对象。
2)垃圾收集和回收时更有效率。
Struts2是类级别的,需要原型实现;
SpringMVC是方法级的,没有共享属性的情况下,线程安全的。
2.使用成员变量在并发情况下的状态
如果设置成员变量,那么在多个请求状态下,该成员变量的值是被共享的;(也就是该成员变量在单例模式下是非线程安全的)
如果只存在读取的操作,则不会有问题。
如果存在写值的操作,则会出现问题,当成员变量值被改变之后,其他请求会请求到修改之后的值。
3.如何正确使用
1.在controller中不使用成员变量;
2.设置controller为多例模式,也就是每请求一次都会创建一个controller的对象。
设置controller为多例,@Scope("prototype")。
这几种做法有好有坏,第一种,需要开发人员拥有较高的编程水平与思想意识,在编码过程中力求避免出现这种BUG,而第二种则是容器自动的对每个请求产生一个实例,由JVM进行垃圾回收,因此做到了线程安全。
使用第一种方式的好处是实例对象只有一个,所有的请求都调用该实例对象,速度和性能上要优于第二种,不好的地方,就是需要程序员自己去控制实例变量的状态保持问题。第二种由于每次请求都创建一个实例,所以会消耗较多的内存空间。
所以在使用spring开发web 时要注意,默认Controller、Dao、Service都是单例的
使用第一种方式的好处是实例对象只有一个,所有的请求都调用该实例对象,速度和性能上要优于第二种,不好的地方,就是需要程序员自己去控制实例变量的状态保持问题。第二种由于每次请求都创建一个实例,所以会消耗较多的内存空间。
所以在使用spring开发web 时要注意,默认Controller、Dao、Service都是单例的