如何将服务类和拦截方法置入对应的流程是ProxyBean要实现的功能。首先要理解动态代理模式。其实代理很简单,例如当你需要采访一名儿童时,首先需要经过他父母的同意,在一些问题上父母也许替他回答,而对于另一些问题,也许父母觉得不太合适,这个小孩会拒绝掉,显然这是父母就是证明儿童的代理(proxy)了。通过代理可以增强或者控制对儿童这个真实对象(target)的访问。 在JDK中提供了类proxy的静态方法——newProxyInstance
public static Object newProxyInstance(ClassLoader classLoader, Class<?>[] interfaces, InvocationHandler invocationHandker) throw IllegalArgumentException
- classLoader——类加载器
- interfaces——绑定的接口,也就是把代理对象绑定到哪些接口下,可以是多个
- invocationHandler——绑定代理对象逻辑实现
这里的invocationHandler是一个接口InvocationHandler对象,它定义了一个invoke方法,这个方法就是实现代理对象的逻辑的。
package com.springboot.chapter4.proxy;
import com.springboot.chapter4.intercept.Interceptor;import com.springboot.chapter4.invoke.Invocation;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * @author nmj * @create 2021-11-20 10:17 */public class ProxyBean implements InvocationHandler { private Object target = null; private Interceptor interceptor = null; /** * 绑定代理对象 * @param target 被代理对象 * @param interceptor 拦截器 * @return 代理对象 */ public static Object getProxyBean(Object target, Interceptor interceptor) { ProxyBean proxyBean = new ProxyBean(); //保存代理对象 proxyBean.target = target; //保存拦截器 proxyBean.interceptor = interceptor; //生成代理对象 Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), proxyBean); return proxy; } /** * 处理代理对象
|