strust2中的action是多例还是单例???

本文探讨了Struts2与Struts1在Action实例模式上的区别,Struts2采用多例模式,每次请求产生一个新的Action实例,确保线程安全;而Struts1采用单例模式,Action实例在所有请求间共享。文章通过具体示例说明了这两种模式的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struts2中action是多例的,即一个session产生一个action
如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修改时间不同,两个用户访问得到的属性不一样,操作得出的结果不一样.
举个例子:有一块布长度300cm,能做一件上衣(用掉100cm)和一件裤子(用掉200cm);甲和乙同时访问得到的长度都是300cm,
甲想做上衣和裤子,他先截取100cm去做上衣,等上衣做完再去做裤子,而乙这时正好也拿100cm去做上衣,那好,等甲做完上衣再做裤子的时候发现剩下的布(100cm)已经不够做裤子了.....这就是影响系统的性能,解决的办法就是给甲和乙一人一块300cm的布,就不会出现布被别人偷用的事情,也是就单实例和多实例的区别
如果设置成单例,那么多个线程会共享一个ActionContext和ValueStack,这样并发访问的时候就会出现问题了
struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象。原因是:struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。所以Struts2的Action是多例模式的。
而struts 1的Action是单实例的,因为它的数据保存在Form类中,多线程环境下,Action只负责处理一些逻辑,并没有数据,也就是大家把它当做一个工具使用。同样servlet也是单实例的

Struts2中,要通过Spring IoC(Inversion of Control)管理Action的生命周期,你可以按照以下步骤进行: 1. **声明Action类**: 首先,在Struts2Action类上添加`@Component`或其对应层面的注解(如`@Controller`、`@Service`或`@Repository`),以便Spring能够识别并管理这些类[^1]。 ```java @Service // 或@Controller或其他Spring注解 public class MyAction implements ActionSupport { //... } ``` 2. **配置Spring**: 在Spring的配置文件(通常是XML或Java Config)中,定义一个bean来代表Action类,并指定`scope="prototype"`或`scope="singleton"`以决定Action的数量和行为。对于Struts2,通常使用`prototype`模式,因为每个HTTP请求可能会创建一个新的Action。 ```xml <!-- XML配置示 --> <bean id="myAction" class="com.example.MyAction" scope="prototype"/> <!-- Java Config示 --> @Bean @Scope(value = "prototype") public MyAction myActionBean() { return new MyAction(); } ``` 3. **依赖注入**: Spring会自动管理Action类的依赖项,包括其属性的注入。可以通过setter方法(设值注入)或构造器参数的方式注入其他Spring管理的组件[^2]。 ```java // 示中的setter注入 private SomeDependency dependency; @Autowired public void setDependency(SomeDependency dependency) { this.dependency = dependency; } ``` 4. **生命周期管理**: - **初始化**: 当Spring容器启动时,它会创建Action并调用其构造函数或setter方法完成初始化。 - **请求处理**: 对于每个HTTP请求,Spring都会从容器中获取一个新的Action,处理完毕后,Action不会被复用,而是被丢弃。 - **销毁**: 如果使用的是原型(prototype)模式,Action在请求结束时会被销毁,Spring会在下次请求时重新创建一个新的实。 这样,Struts2 Action的生命周期就交给了Spring IoC容器管理,实现了松散耦合和高效资源利用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值