Java拦截器

来源:互联网 发布:任天堂vb算vr吗 编辑:程序博客网 时间:2024/06/16 03:09

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和afterpublic 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()方法

0 0
原创粉丝点击