使用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就不会保留上一次的值,从而避免上述后果的出现。
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就不会保留上一次的值,从而避免上述后果的出现。