使用Spring的单例创建Struts2 action Bean的问题

 

使用Spring的单例Singlton和原型(多例)来创建action Bean:
javabean使用两种方式来进行部署:单例和原型
当一个Bean是单例模式的情况下, Spring将只管理一个共享实例. 整个spring IOC容器内是唯一的,共享的。
原型的部署方式是每次响应一个访问请求的时候都将重新创建一个实例action

所有的Bean默认情况下都是使用Singlton方式来进行部署的,除非手动特殊指定

 

在action中我们会定义一些成员变量用于接收页面传过来的参数

比如页面有的输入用户名的文本框name

在action中通过定义name和getter,setter方法就可以得到输入的用户名,然后再某个方法里使用

 

private String name;

 

public void setName(String name){

 

    this.name=name;

}

 

public String getName(){

    return this.name;

}

 

问题来了

我们用完name,一般情况下就会不管他了,让他自生自灭(gc)。这样的做法在没有spring支持或在spring的原型模式下是没问题的

因为每次调用系统都要创建一个新的action,name也是新的,默认是null。

 

如果是在spring单例模式下,这样不管他就会出问题了,action会一直存在(直到服务器关了或重启),存在spring的IOC容器里面,既然action一直存在没有被销毁,那么action的成员name也会一直存在,这样如果通过浏览器地址直接访问这个action,那么就完全可以绕过输入用户名的阶段直接进入到其他页面。由于IOC容器时在服务里,所以,无论是不同浏览器,不同客户端,都能得到name,直接访问action成功。

 

知道了原理以后,我们的做法是用完name后手动销毁(name=null),这样action一直存在,但它的成员name就不会保留上一次的值,从而避免上述后果的出现。

 

引用我曾经跟过的一个项目经理的一句话:spring是汪洋大海,想要精通spring,还需要很长的路要走。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值