springMVC 谨慎使用成员变量

来源:互联网 发布:粒子群算法 python 编辑:程序博客网 时间:2024/06/05 09:27

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都是单例的

原创粉丝点击