Struts2的拦截机制是基于动态代理实现的。而动态代理的实现条件是:
- 定义一个业务逻辑类(被代理的类)与对应的业务逻辑接口
- 定义一个实现了InvocationHandler接口的执行控制器
/**
* 实现了InvocationHandler接口的执行控制器.
*
* @author ex-spring
*/
import java.lang.reflect.InvocationHandler;
public class BankProxyHandler implements InvocationHandler {
// 被代理的对象
private Object target;
// 系统日志服务
LogBank lb = new LogBank();
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
Object result = null;
//拦截remit方法
if(arg1.getName().equals("remit")){
//调用日志拦截器
lb.writeLog("开始汇款日志记录");
result = arg1.invoke(target,arg2);
//调用日志拦截器
lb.writeLog("结束汇款日志记录");
}
else{
System.out.println("调用了存款模块");
result = arg1.invoke(target,arg2);
}
return result;
}
public void setTarget(Object target){
this.target = target;
}
}
BankProxyfactory .java
/**
* 生成代理的工厂类
*
* @author ex-spring
*/
public class BankProxyfactory {
public static Object getProxy(Object obj){
BankProxyHandler bh = new BankProxyHandler();
bh.setTarget(obj);
//通过Proxy.newProxyInstance方法返回一个代理类
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),bh);
}
}
/**
* 运行
*
* @author ex-spring
*/
public class TestRun {
public static void main(String[] args) {
Bank mb = new Bank();
Bankinterface bi = (Bankinterface)BankProxyfactory.getProxy(mb);
bi.remit();
bi.saving();
}
}