Struts2(8):拦截器的简单实现原理

本文介绍了一种基于AOP的拦截器实现方法,通过五个关键类(目标接口、目标实现、拦截器、处理器和代理类)展示了如何在方法执行前后增加额外的操作。
什么是拦截器:
拦截器,在AOP(Aspect-Oriented Programming)中用于在执行目标对象某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
下面模拟拦截器的实现,一共需要5个类:
1,目标对象接口 TargetInterface.java
2,目标对象接口实现类 Target.java
3,拦截器类 Interceptor.java
4,处理器类 MyHandler.java
5,代理类 MyProxy.java

1,TargetInterface接口中声明一个doSomething方法

public interface TargetInterface {
public void doSomething();
}

2,Target 类实现TargetInterface接口,并实现doSomething方法
public class Target implements TargetInterface {

public void doSomething() {
System.out.println("do something");
}

}

3,Interceptor.java拦截器中定义两个方法,分别执行在目标对象方法前,后执行。
public class Interceptor {
public void before(){
System.out.println("before...");
}
public void after(){
System.out.println("after...");
}
}

4,在处理器类MyHandler类中将目标对象与拦截器类关联起来,使用反射调用目标对象,并在执行目标对象方法前后执行拦截器中的方法。
public class MyHandler implements InvocationHandler {

private Object object;

private Interceptor interceptor = new Interceptor();

public void setObject(Object object) {
this.object = object;
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
interceptor.before();
result = method.invoke(object, args);
interceptor.after();
return result;
}

}

5,在代理类MyProxy中声明处理器类,通过动态代理调用处理器类。
public class MyProxy {
public Object getProxy(Object object){
MyHandler myhandler = new MyHandler();
myhandler.setObject(object);
return Proxy.newProxyInstance(Target.class.getClassLoader(), object.getClass().getInterfaces(), myhandler);
}
}



最后写一个测试类来进行测试:
public class Client {
public static void main(String[] args) {
TargetInterface target = new Target();
MyProxy myProxy = new MyProxy();
TargetInterface proxy = (TargetInterface)myProxy.getProxy(target);
proxy.doSomething();
}
}

结果将打印出
before
do something
after
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值