Spring IOC容器管理struts2中遇到的一些问题

来源:互联网 发布:js阻止超链接跳转 编辑:程序博客网 时间:2024/05/16 04:45

情景描述:
图片上传Action中主要功能是图片上传与压缩,生产环境出现原图与缩略图不一致?(开发环境没有出现过)

初步怀疑是高并发导致。

自己的思路:因为知道struts2是线程安全的,每个请求都会新建一个action实例,所以排除了不同请求,成员变量共享问题。然后一直检查代码…最后想到struts2是交给spring IOC容器管理的,是不是这块有问题。
于是网上找了,果然如此。

结论:
Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。所以我们可以在Struts2的Action里面去定义属性。但是Struts2由于 Action和普通的Java类没有任何区别(也就是不用像Struts1里面那样去实现一个Struts的接口,有兴趣的朋友可以自己去了解),所以我们可以用Spring去管理Struts2的Action,这个时候我们就要注意了,因为当我们在spring里面去定义bean的时候,spring默认用的是单例模式。所以在这个时候,你就要修改Spring的配置文件—即修改scope为prototype。
为什么struts1中并没有考虑到线程问题,因为所有的代码都是写在execute的方法中,所有变量都是定义在里面,所以没有线程安全问题。
而现在的struts2就不一样了。struts2的action中就像一个POJO一样,定义了很多的类变量。这就有线程安全问题了。。此时,就使用scope=prototype来指定是个原型模式,而不是单例,这样就解决了线程安全问题。每个线程都是一个新的实例。

这是strus2官方文档中的一句话:Only Use Local Variables - The most important principle that aids in thread-safe coding is to use only local variables, not instance variables , in your Action class.不懂的自己脑补吧….

0 0
原创粉丝点击