java

位置:IT落伍者 >> java >> 浏览文章

Java实现的拦截器


发布日期:2020年12月18日
 
Java实现的拦截器

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

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

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

模型分为以下模块

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

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

代理对象Proxy对象

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

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

以下是模型的实现

业务组件分为业务接口和业务类

/**

* 业务组件接口

*/

public interface BusinessInterface {

public void doSomething();

}

/**

* 业务组件

*/

public class BusinessClass implements BusinessInterface{

public void doSomething() {

Systemoutprintln(业务组件BusinessClass方法调用:doSomething());

}

}

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

import javalangreflectInvocationHandler;

import javalangreflectMethod;

import javalangreflectProxy;

/**

* 动态代理处理器工具

*/

public class DynamicProxyHandler implements InvocationHandler {

private Object business; //被代理对象

private InterceptorClass interceptor = new InterceptorClass(); //拦截器

/**

* 动态生成一个代理类对象并绑定被代理类和代理处理器

*

* @param business

* @return 代理类对象

*/

public Object bind(Object business) {

thisbusiness = business;

return ProxynewProxyInstance(

//被代理类 的ClassLoader

businessgetClass()getClassLoader()

//要被代理 的接口本方法返回对象会自动声称实现了这些接口

businessgetClass()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;

interceptorbefore();

result=methodinvoke(businessargs);

interceptorafter();

return null; //To change body of implemented methods use File | Settings | File Templates

}

}

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

/**

* 拦截器

*/

public class InterceptorClass {

public void before(){

Systemoutprintln(拦截器InterceptorClass方法调用:before()!);

}

public void after(){

Systemoutprintln(拦截器InterceptorClass方法调用:after()!);

}

}

模拟客户端执行业务处理的入口

/**

* 客户端

*/

public class Client {

public static void main(String args[]) {

DynamicProxyHandler handler = new DynamicProxyHandler();

BusinessInterface business = new BusinessClass();

BusinessInterface businessProxy = (BusinessInterface) handlerbind(business);

businessProxydoSomething();

}

}

               

上一篇:java swing 9.27 课程

下一篇:比尔学Java:Java Socket篇