1、在没有集成之前,struts本身是怎么管理的?
struts配置
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!--不使用spring作为bean工厂-->
<!--<constant name="struts.objectFactory" value="spring"></constant>-->
<constant name="struts.devModel" value="true"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.action.excludePattern" value="/viewspc/*,/easyui152/*,/myServlet/*" />
</struts>
action配置
<action name="login" class= "sys.action.impl.LoginAction">
<result name="SUCCESS">/viewspc/logins/login.html</result>
</action>
action代码
package sys.action.impl;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import sys.action.ILoginAction;
public class LoginAction extends ActionSupport implements ILoginAction {
private static Logger logger = Logger.getLogger(LoginAction.class.toString());
private SessionFactory sessionFatory;
private static int instanceCount;
private List list;
private List list2;
static{
instanceCount=0;
}
/**
*
*/
private static final long serialVersionUID = 7384325442424101720L;
public LoginAction(){
instanceCount++;
list = new ArrayList();
System.out.println("LoginActin:"+instanceCount);
}
@SuppressWarnings("rawtypes")
@Override
public String execute() throws Exception {
int i =(int) (Math.random()*100);
int k = (int) (Math.random()*100);
int size2 = (list2==null)?0:list2.size();
System.out.println("before list1:"+list.size());
System.out.println("before list2:"+size2);
list2 = new ArrayList();
while(k>=0){
list2.add(Math.random()*100);
k--;
}
while(i>=0){
list.add(i);
i--;
}
System.out.println("after lsit1:"+list.size());
System.out.println("after list2:"+list2.size());
return "SUCCESS";
}
public SessionFactory getSessionFatory() {
return sessionFatory;
}
public void setSessionFatory(SessionFactory sessionFatory) {
this.sessionFatory = sessionFatory;
}
}
测试结果
Struts为每一个请求使用一个action实例来处理,也就是默认情况下action是线程安全的。
2、使用singleton
spring配置
<bean id="login" class="sys.action.impl.LoginAction" scope="singleton" >
<property name="sessionFatory" ref="sessionFactory_lsdl"></property>
</bean>
测试结果
可见:1、action已经在spring容器启动的时候进行了初始化
2、action是单例的,所以list1一直增长。
3、重点是list2,在没有下次请求到来之前,list2引用上一次请求时所给的变量。如果某一次产生了大量数据,之后没有在再次请求,那么list2持有的资源不会被释放。
3、使用prototype
测试结果
每一次请求,spring都注入一个实例,action是安全的
结论:当使用spring和struts集成时,action的作用域最好使用prototype。