首页 > 技术文章 > struts1 和 struts2中Action什么时候实例化

yw-ah 2016-08-11 15:29 原文

精帖1:http://blog.csdn.net/lfsf802/article/details/7277013 
精帖1:http://blog.csdn.net/wmj2003/article/details/5018927 

struts2.x的action是有状态的,因此的scope需要是prototype,防止并发数据异常。struts1.x的action是无状态的,因此的scope要设为singleton或默认,效率高。 

struts1.x默认是单实例(singleton),就是你每次请求都是由同一个action来处理。所以struts1.x默认指定,就存在并发问题。而strust2.x默认是多实例(prototype),每个请求都会产生相应的action实例去处理,这就避免并发问题。 

线程模式: 

Struts1: Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。 

Struts2: Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题) 


Action执行的控制: 

Struts1:支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。 

Struts2:支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。 



struts1的Action 是在第一次请求的时候实例化的,比如第一次请求LoginAction时会创建这个Action, 之后并没有放弃这个Action实例 而是将Action实例放在一个Map 中 当你再一次请求LoginAction的时候会先从这个Map中去找,如果找到了就直接用,没找到才创建. 


struts2 的Action 是每次请求的时候都会帮你创建一个对象, 我个人认为原因在于 struts2中的Action因为要有收集数据的javaBean的功能, 所以你会想的到,它如果是单例模式的话,会有什么危险 

推荐阅读