java拦截器是基于动态代理(反射机制)实现的。
拦截器是AOP(Aspect Oriented Programming,即面向方面编程的技术)的一个实现
业务接口和业务实现类
public interface IOAService {
public void onclineOffice();
}
public class OAService implements IOAService {
@Override
public void onclineOffice() {
System.out.println("onclineOffice工作中。。。");
}
}
Brightmart的动态代理类,它有两个普通方法:before和after.
//Brightmart自定义的拦截器类,它有两个普通方法:before和after
public class BrightmartInterceptor {
public void before() {
System.out.println("Brightmart的拦截器类,的before()方法");
}
public void after() {
System.out.println("Brightmart的拦截器类,的after()方法");
}
}
Brightmart的动态代理类,用于代理某个类。本示例中我们用来代理【OA办公系统】服务类,目标是将特定的任务绑定到【OA办公系统】服务类之前或之后来执行。我们可以认为在绑定了绑定被代理类和代理处理器(bind()),并显示调用被代理类的方法时候,invoke便被执行
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class BrightmartDynamicProxy implements InvocationHandler {
// 被代理的对象
private Object object;
// Brightmart自定义的拦截器(它是一个普通的类)
private BrightmartInterceptor interceptor = new BrightmartInterceptor();
// 动态生成一个代理类对象,并绑定被代理类(object)和代理处理器(this).
// 或者说:bind方法返回一个特定的,具有代理功能的对象,这个对象根据传入的被代理对象的接口而定。
public Object bind(Object object) {
this.object = object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
}
// method:被调用的方;args:方法的参数;标记为1,2的方法可以根据你业务需要而改动,或只在调用前或调用后执行某种操作
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
interceptor.before();// 1 调用before方法
method.invoke(object, args);
interceptor.after();// 2 调用after方法
return result;
}
}
执行自定义拦截器类
public class TestBrightmartInterceptor {
public static void main(String[] args) {
// Brightmart自己实现的拦截器,调用bind方法获取一个代理类,这个代理类调用原有的业务逻辑类(被代理类)的方法。
BrightmartDynamicProxy handler = new BrightmartDynamicProxy();
IOAService oaService = new OAService();
IOAService oaServiceProxy = (IOAService) handler.bind(oaService);// 关键代码
oaServiceProxy.onclineOffice();
}
}
运行结果如下:
Brightmart的拦截器类,的before()方法
我们使用OA在线办公系统onclineOffice,工作中(onlineOffice)。。。
Brightmart的拦截器类,的after()方法