zoukankan      html  css  js  c++  java
  • SSM学习笔记(6)---拦截器

    问题

    1、什么是拦截器,做什么的

    2、拦截器的逻辑

    3、拦截器的实现

    解决

    1、、

    由于动态代理一般比较难理解,程序设计者会设计一个拦截器接口供开发者使用,开发者只要知道拦截器接口的方法、含义和作用即可

    2、

    开发者提供拦截器,设计者设置拦截器,调用拦截器before()方法

    如果返回是false调用拦截器around()方法

    如果返回是true,反射原来方法

    最后调用拦截器after()方法

    3、

    定义拦截器接口Interceptor

    public interface Interceptor{

    public boolean before(Object proxy,Object target, Method method, Object [] args);

    //在before方法返回false的情况下,调用around方法

    public void around(Object proxy, Object target,Method method,Object [] args);

    public void after(Object proxy,Object target,Method method, Object [] args);

    }

    MyInterceptor

    public class MyInterceptor implements Interceptor{

    public boolean before(Object proxy,Object target,Method method,Object [] args){

    System.err.println("反射方法前的逻辑");

    return false;//不反射被代理对象原有对象

    }

    public void after(Object proxy,Object target,Method method , Object [] args){

    System.err.println("反射方法后逻辑");

    }

    public void around(Object proxy, Object target,Method method,Object [] args){

    System.err.println("取代了被代理对象的方法");

    }

    在JDK动态代理中使用拦截器

    public class InterceptorJdkProxy implements InvocationHandler{

    private Object = null;//真实对象

    private String interceptorClass = null;//拦截器全限定名

    public InterceptorJdkProxy (Object target,String interceptorClass){

    this.target = target ;

    this.interceptorClass = interceptorClass;

    }

    public static Object bind(Object target, String interceptorClass){

    //取得代理对象

    return Proxy.newProxyInstance(target.getClass().getClassLoaser(),

    target.getClass().getInterfaces(),

    new InterceptorJdkProxy(target,interceptorClass());

    }

    public Object invoke(Object target, Method method,Object [] args) throws Throwable{

    if(interceptorClass == null){

    //如果没有设置拦截器则直接反射原来的方法

    return method.invoke(target, args);

    }

    Object result = null;

    //通过反射生成拦截器

    Interceptor interceptor =

    (Incerceptor) Class.forName(interceptorClass).newInstance();

    //调用前置方法

    if(interceptor.before(proxy,target,method,args)){

    //反射原有对象方法

    result = method.invoke(target,args);

    }else{//返回false执行around方法

    interceptor.around(proxy,target,method,args);

    }

    //调用后置方法

    interceptor.after(proxy,target,method,args);

    return result;

    }

    public static void main(String [] args){

    HelloWorld proxy = (HelloWorld) InterceptorJdkProxy.bind(new HelloWorldImpl(),

    "com.lean.ssm.chapter2.interceptor.MyInterceptor");

    proxy.sayHelloWorld();

    }

    会当凌绝顶,一览众山小
  • 相关阅读:
    Power Strings P5019
    Floyd模板题 P1704
    【训练题】强连通分量缩点 P1679
    字符串hash模板题 P5018
    Dijkstra模板题 P1710
    【训练题】分队 P1672
    二分图模板题 P1631
    【训练题】无序字母对 P1675
    KMP模板题 P1537
    马路 树链剖分/线段树/最近公共祖先(LCA)
  • 原文地址:https://www.cnblogs.com/quenvpengyou/p/12820024.html
Copyright © 2011-2022 走看看