由于在真实的开发中,我们不可能只写一个Action,而是写很多Action,但是由于每一个Action我们都需要写下面的代码,这样就产生了大量的冗余代码,且代码的复用性也不好,于是我们就可以想办法把这些公共的代码抽取出来组成一个类,然后然其他类继承它,这样不是能更好的提高代码的复用性了吗?
下面我们开始抽取一个基类
package com.bos.web.action.base;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/*
控制层Action基类
*/
@Controller
public class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
// 模型对象
private T model;
@Override
public T getModel() {
return model;
}
// 在构造方法中动态获取实体对象,通过反射创建模型对象
public BaseAction() {
ParameterizedType pt = (ParameterizedType)this. getClass().getGenericSuperclass();
// 获取BaseAction声明的泛型数组
Type[] arr = pt.getActualTypeArguments();
Class<T> entityClass=(Class<T>) arr[0];
//通过反射创建model对象
try {
model= entityClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
在这里还要特别强调一点就是,如果我们在测试的时候添加了红框中的注解,那么是没有办法测试的
1、scope = singlton 单例模式,对象在容器中全局唯一,在IOC容器初始化的时候该对象就会被创建。
2、scope = prototype 多例模式,在每一次调用getBean的时候IOC容器才会创建该对象的实体,并且每次创建都是不同的对象。
测试代码 (抽取后当我们创建新的Action时是不是少写了很多代码呢)
package com.bos.web.action.base;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.bos.bean.base.Area;
@Controller
//@Scope(value="prototype")
public class AreaAction extends BaseAction<Area> {
}
测试结果