拦截器原理

实现模型:

  • 业务组件

  • 业务处理器

  • 代理

  • 客户端
    业务组件:

public interface BusinessFacade {
    void say();
}

public class BusinessFacadeImpl implements BusinessFacade {
    public void say() {
        System.out.println("hello interceptor");
    }
}

业务处理器

public class InterceptorClass {
    public void preHandler() {
        System.out.println("before");
    }

    public void postHandler() {
        System.out.println("before return modelAndview");
    }
}

代理:

public class DynamicProxyHandler implements InvocationHandler {
    private BusinessFacade facade;

    private InterceptorClass interceptor = new InterceptorClass();

    public BusinessFacade bind(BusinessFacade facade) {
        this.facade = facade;

        return (BusinessFacade) Proxy.newProxyInstance(this.getClass().getClassLoader() , facade.getClass().getInterfaces() , this);
    }

    /**
     *
     * @param proxy : 代理类的实例
     * @param method : 需要执行的方法
     * @param args : 需要执行的方法的参数
     * @return
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        interceptor.preHandler();
        Object result = method.invoke(facade , args);
        interceptor.postHandler();
        return result;
    }
}

客户端:

public class Client {
    public static void main(String[] args) {
        BusinessFacade facade = new BusinessFacadeImpl();
        DynamicProxyHandler proxy = new DynamicProxyHandler();
        BusinessFacade businessFacade = proxy.bind(facade);
        businessFacade.say();
    }
}
image.png

todo:执行businessFacade.say(),是怎么执行invoke方法的? 需要看Proxy的源码。

参考:http://paddy-w.iteye.com/blog/841798

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容