用spring的factory.getbean("")方法构造的bean默认是单态的,所以尽量不要在bean中构造实例字段,并在外部对该字段进行修改,在内部对其读取。否则就会出现多错误。推而广之所有单态的类都应该避免使用实例字段。
此外对单态模式来说spring 构造bean用的是单态,struts1中的action 也是单态,servlet也是单态的。从设计模式的角度来讲可以总结出一条规律,一般来说处于控制逻辑的类一般都设计为单态的,而存储数据的类,或称之为状态类都不应设计为单态的(这个很容易想得到)。
但是到了webwork,以及struts2他们当中的action就不是单例的了,这个又有一点例外。用他们的话就是损失了一点性能,而提高了安全。
不妨看一看struts1和webwork的源代码,他们的请求都转向一个控制转向的servlet,这个servlet再根据请求的不同交给不同的action处理,所不同的是,struts1中创建了一个map他将创建的各个action实例存入map中(对于每个action只创建了一个实例),当用到某个具体的action 去处理请求时,便从map中取出该action来处理。而webwork对于一个请求如果要用某个action去处理就直接再创建该action的实例。
此外对单态模式来说spring 构造bean用的是单态,struts1中的action 也是单态,servlet也是单态的。从设计模式的角度来讲可以总结出一条规律,一般来说处于控制逻辑的类一般都设计为单态的,而存储数据的类,或称之为状态类都不应设计为单态的(这个很容易想得到)。
但是到了webwork,以及struts2他们当中的action就不是单例的了,这个又有一点例外。用他们的话就是损失了一点性能,而提高了安全。
不妨看一看struts1和webwork的源代码,他们的请求都转向一个控制转向的servlet,这个servlet再根据请求的不同交给不同的action处理,所不同的是,struts1中创建了一个map他将创建的各个action实例存入map中(对于每个action只创建了一个实例),当用到某个具体的action 去处理请求时,便从map中取出该action来处理。而webwork对于一个请求如果要用某个action去处理就直接再创建该action的实例。