Java实现的拦截器

来源:互联网 发布:装完软件蓝屏 编辑:程序博客网 时间:2024/06/05 19:47

拦截器在在流行的开源框架中很常见,依赖的技术就是Java的动态代理。

  理解拦截器的核心原理对理解这些开源框架的体系结构至关重要。

  下面以一个简单的模型的来说明拦截器的实现的一般方法。

  模型分为以下模块:

  业务组件:是被代理和被拦截的对象。

  代理处理器:实现了InvocationHandler接口的一个对象

  代理对象:Proxy对象。

  拦截器:普通的JavaBean,在调用业务方法的之前或者之后会自动拦截并执行自己的一些方法。

  客户端:执行业务处理的入口。

  以下是模型的实现

  一、业务组件:分为业务接口和业务类

  /**  * Created by IntelliJ IDEA.  * User: leizhimin  * Date: 2008-3-20 23:32:06  * Company: LavaSoft(http://lavasoft.blog.51cto.com/)  * 业务组件接口  */  public interface BusinessInterface {  public void doSomething();  }  /**  * Created by IntelliJ IDEA.  * User: leizhimin  * Date: 2008-3-20 23:31:12  * Company: LavaSoft(http://lavasoft.blog.51cto.com/)  * 业务组件  */  public class BusinessClass implements BusinessInterface{  public void doSomething() {  System.out.println("业务组件BusinessClass方法调用:doSomething()");  }  }

  二、代理处理器:包含了业务对象绑定动态代理类的处理,并实现了InvocationHandler接口的invoke方法。

  import java.lang.reflect.InvocationHandler;  import java.lang.reflect.Method;  import java.lang.reflect.Proxy;  /**  * Created by IntelliJ IDEA.  * User: leizhimin  * Date: 2008-3-20 23:24:10  * Company: LavaSoft(http://lavasoft.blog.51cto.com/)  * 动态代理处理器工具  */  public class DynamicProxyHandler implements InvocationHandler {  private Object business; //被代理对象  private InterceptorClass interceptor = new InterceptorClass(); //拦截器  /**  * 动态生成一个代理类对象,并绑定被代理类和代理处理器  *  * @param business  * @return 代理类对象  */  public Object bind(Object business) {  this.business = business;  return Proxy.newProxyInstance(  //被代理类的ClassLoader  business.getClass().getClassLoader(),  //要被代理的接口,本方法返回对象会自动声称实现了这些接口  business.getClass().getInterfaces(),  //代理处理器对象  this);  }  /**  * 代理要调用的方法,并在方法调用前后调用连接器的方法.  *  * @param proxy 代理类对象  * @param method 被代理的接口方法  * @param args 被代理接口方法的参数  * @return 方法调用返回的结果  * @throws Throwable  */  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  Object result = null;  interceptor.before();  result=method.invoke(business,args);  interceptor.after();  return null; //To change body of implemented methods use File | Settings | File Templates.  }  }

  三、拦截器:普通的JavaBean,在调用业务方法的之前或者之后会自动拦截并执行自己的一些方法。

  /**  * Created by IntelliJ IDEA.  * User: leizhimin  * Date: 2008-3-20 23:26:31  * Company: LavaSoft(http://lavasoft.blog.51cto.com/)  * 拦截器  */  public class InterceptorClass {  public void before(){  System.out.println("拦截器InterceptorClass方法调用:before()!");  }  public void after(){  System.out.println("拦截器InterceptorClass方法调用:after()!");  }  }

  四、模拟客户端:执行业务处理的入口。

  /**  * Created by IntelliJ IDEA.  * User: leizhimin  * Date: 2008-3-21 0:32:55  * Company: LavaSoft(http://lavasoft.blog.51cto.com/)  * 客户端  */  public class Client {  public static void main(String args[]) {  DynamicProxyHandler handler = new DynamicProxyHandler();  BusinessInterface business = new BusinessClass();  BusinessInterface businessProxy = (BusinessInterface) handler.bind(business);  businessProxy.doSomething();  }  }
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 十字螺丝拧花了怎么办 梅花螺丝滑丝了怎么办 螺丝孔道滑丝了,怎么办 锅把铆钉松啦怎么办 膨胀螺丝孔大了怎么办 戒指不圆了怎么办妙招 眼镜框的腿断了怎么办 弹簧腿眼镜坏了怎么办 vps搭建ss被墙怎么办 注塑机螺杆黏料怎么办 分解师耐久度0了怎么办 有鼻涕擤不出来怎么办 擤鼻涕耳朵堵了怎么办 脸用什么都过敏怎么办 1岁宝宝流清鼻涕怎么办 2岁宝宝流清鼻涕怎么办 3岁儿童流清鼻涕怎么办 鼻子老是流清水鼻涕怎么办 5岁儿童感冒鼻塞怎么办 3岁宝宝感冒鼻塞怎么办 宝宝9个月流鼻涕怎么办 鼻涕又黄又粘稠怎么办 鼻子一直流黄水怎么办 宝宝眼屎多又黄怎么办 宝宝痰多鼻涕多怎么办 小孩痰多鼻涕多怎么办 用qq登不了微博怎么办 中国银行u盾丢了怎么办 我的世界遇见him怎么办 考军校年龄超了怎么办 dnf组队就红电脑怎么办 九阳高压锅漏气怎么办 晋江买了防盗章怎么办 开车撞了人应该怎么办 开车撞了人没钱怎么办 驾照扣分12分后怎么办 车被交警拖走了怎么办 符石耐久没了怎么办 冒险岛2老是掉线怎么办 冒险岛老是掉线怎么办 冒险岛2延迟高怎么办