🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 1. 什么是代理代理、 Jdk代理: 假如我们的业务需要符合一定的要求,做一些相关的业务,我们可以使用动态代理 ## 2.怎么理解动态代理 ## 3.代码 public interface IService { public String BeforeAdvice(int id); public String AfterAdvice(int id); } public class IServiceImpl implements IService { public String BeforeAdvice(int id){ System.out.println("-------------advice--------------"); return "前置通知"+id; } public String AfterAdvice(int id){ return "后置通知"+id; } } public class MyInvovationHandler implements InvocationHandler{ private Object target; //们既然要做代理,我们必须知道我们是给谁做代理,这里的 obj就是被代理者。 Object result = null; public MyInvovationHandler(){ super(); } public MyInvovationHandler(Object target) { super(); this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if("BeforeAdvice".equals(method.getName())){ System.out.println("+++++++ ++ ++before+++++++++++++"+method.getName()+"+++++++++++++++"); result = method.invoke(target,args); System.out.println("+++++++++++after+++++++++++++"+method.getName()+"++++ +++++++++++"); }else{ result = method.invoke(target, args); } return result; } } public class MainQ { public static void main(String[] args) { IServiceImpl iService = new IServiceImpl(); MyInvovationHandler invocationHandler = new MyInvovationHandler(iService); //通过刚才创建的InvocationHandler,创建真正的代理者。第一个参数是类加载器,第二个参数是这 // 个代理者实现哪些接口(与被代理者实现的是相同的接口) IService userServiceProxy = (IService) Proxy.newProxyInstance(iService.getClass().getClassLoader(), iService.getClass().getInterfaces(), invocationHandler); System.out.println(userServiceProxy.BeforeAdvice(1)); System.out.println(userServiceProxy.AfterAdvice(1)); } } ## cglib代理 public class CglibProxy implements MethodInterceptor{ @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("++++++before " + methodProxy.getSuperName() + "++++++"); System.out.println(method.getName()); Object o1 = methodProxy.invokeSuper(o, objects); System.out.println("++++++before " + methodProxy.getSuperName() + "++++++"); return o1; } } public class MainThread { public static void main(String[] args) { CglibProxy cglibProxy = new CglibProxy(); Enhancer enhancer = new Enhancer(); //主要的增强类 enhancer.setSuperclass(IServiceImpl.class); //设置父类,被增强的类 enhancer.setCallback(cglibProxy); //回调对象 IService o = (IService) enhancer.create();//用cglibProxy来增强UserServiceImpl o.BeforeAdvice(1); } } ## 总结: ### Jdk代理 我们定义了一个接口,里面有两个方法,然后重写这个两个方法, 接着写一个类用于实现InvocationHandler 然后重写里面的方法invoke方法里面有三个参数,第一个参数是代理对象,第二个方法是:真实对象的方法,第三个参数是方法的 代理,然后通过Proxy.newProxyInstance()该方法第一个参数是实现类对象的加载器,实现类对象的实现接口,第三个是我们定义的处理方法 ### Cglib代理 实现了MethodInterceptor方法,重写了intercept方法第一个参数是对象,第二个参数是方法,第三个是参数,第四个是代理类对象,然后通过反射类对象执行, Cglib代理类的调用实现过程 第一步: 创建代理类对象 CglibProxy cglibProxy = new CglibProxy(); 第二步:创建增强类对象 Enhancer enhancer = new Enhancer() enhancer.setSuperclass(IServiceImpl.class) 第三步:设置回调接口 enhancer.setCallback(cglibProxy) 第四步: 用cglibProxy来增强UserServiceImpl IService o = (IService) enhancer.create(); 第五步:调用方法 o.BeforeAdvice(1);