看到有状态会话Bean与无状态会话Bean首先会想到就是这里的状态指的是什么?

1、有状态(Stateful)

  可以在不同的方法调用间保持针对各个客户端的状态

       与客户端的联系必须被维持,这样做开销要大一些

       有状态也可以这样理解,它存在存储能力,也就是说至少有一个属性来标识它目前的状态,例如:



public class Stateful {

	private String name;
	
	public Stateful(String name){
		this.name = name;
	}
	
	public String Hello(){
		return "hello " + this.name;
	}
	
	public static void main(String[] args) {
		
		Stateful stateless1 = new Stateful("chain");
		System.out.println(stateless1.Hello());
		
		Stateful stateless2 = new Stateful("world");
		System.out.println(stateless2.Hello());
		
	}
}

输出结果:


hello chain
hello world

       注意:有状态会话bean,每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。

2、无状态(Stateless)

        在不同方法调用间不保留任何状态

        事务处理必须在一个方法中结束,这样占用资源较少,还可以被共享

        无状态从字面的意思来理解就是没有能够标识它目前状态属性的bean,例如:

public class Stateless {

	public Stateless(){}
	
	public String Hello(){
		return "hello world";
	}
	
	public static void main(String[] args) {
		
		Stateless stateless1 = new Stateless();
		System.out.println(stateless1.Hello());
		
		Stateless stateless2 = new Stateless();
		System.out.println(stateless2.Hello());
		
	}
}

输出结果:

hello world
hello world


       生成的两个实例对象,它们都是没有状态的,对于客户端来说,它们是没有差别的(但stateless1  != stateless2),所以同一个无状态回话bean的实例都是相同的,可以被不同的客户端重复使用。


但无状态会话bean并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。

3、总结

       无状态的会话bean不保持任何与客户端的会话状态,发给 bean的每一次请求需同时提供数据来进行请求处理。有状态的会话bean,与之相反,可以保持状态,并且该状态可以在与客户的多次会话中存在。
       有状态的bean带来了支持会话状态的好处但同时付出了性能的代价。无状态bean具有更好的性能,但却又不具备与客户端的亲合力。struts2中将Action和ActionForm合二为一,就有了状态,因为每次请求都创建一个新的实例,所以没有线程安全问题,而struts1就不能这么做了,struts1的Action采用的是单例模式,仅有Action的一个实例来处理所有的请求,所以使用struts1的时候要特别小心,要保证Action的资源是线程安全最好采用无状态。