代理设计模式
1:基本概念
2:JDK动态代理
1. 创建接口
2. 创建实现类
3. 创建代理类
/** * jdk动态代理 不能满足 继承父类的情况 * * AnimalProxy 代理类 */ public class AnimalProxy implements InvocationHandler{ /** * 这里绝对不能使用Dog! 因为我们压根不知道谁是委托类 */ private Object object; /** * 给我传递一个委托类,我们返回一个代理类 */ public Object createProxy(Object target){ this.object=target; //传递dog 委托类就是dog 传递什么 委托类是什么 return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } /** * 代理类给委托类 工作的方法 * 给 主业务增强 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("====洗洗手===="); Object result= method.invoke(object,args); //有返回值 使用变量接收 System.out.println("====再次洗洗手===="); return result; } //测试代码 public static void main(String[] args) { AnimalProxy proxy=new AnimalProxy(); Animal dog= (Animal) proxy.createProxy(new Dog()); dog.eat(); System.out.println("*********************"); dog.sleep(); } }
问题:
如果我们上诉案例中的Animal改成了 抽象类,
Dog改成了继承Animal,那么测试代码将会出现错误!
因为JDK动态代理 只支持接口!那么我们就使用CGLIB动态代理!
3:CGLIB动态代理
/** * CglibProxy 代理类 (接口 + 类) */ public class CglibProxy implements MethodInterceptor { private Enhancer enhancer=new Enhancer(); /** * 创建代理类对象 */ public Object createProxy(Class clazz){ //设置公共的接口或者父类 enhancer.setSuperclass(clazz); enhancer.setCallback(this); return enhancer.create(); } /** * 代理类执行 委托类的 方法 * 系统级业务进行增强 */ public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("====洗洗手===="); Object result= methodProxy.invokeSuper(o,args); System.out.println("====再次洗洗手===="); return result; } //测试代码 public static void main(String[] args) { CglibProxy proxy=new CglibProxy(); Animal dog= (Animal) proxy.createProxy(new Dog().getClass()); dog.eat(); System.out.println("*********************"); dog.sleep(); } }
未完待续!!!