网站打开速度加快怎么做,法拍重庆网站,报告,北京社保网上服务平台官网看了这篇文章#xff0c;你会对静态代理模式#xff0c;JDK 动态代理模式和 CGLIB 动态代理模式有个很清晰的认识。01、简介什么是代理模式代理模式也称为委托模式#xff0c;属于结构型模式之一。在某些情况下#xff0c;一个对象不适合或者不能直接引用另一个对象#x… 看了这篇文章你会对静态代理模式JDK 动态代理模式和 CGLIB 动态代理模式有个很清晰的认识。01、简介什么是代理模式代理模式也称为委托模式属于结构型模式之一。在某些情况下一个对象不适合或者不能直接引用另一个对象而代理对象可以在客户端和目标对象之间起到中介的作用比如我们生活中的邮局快递公司婚介所等等。代理模式分类代理模式分为静态代理模式和动态代理模式。静态代理是由程序员创建或特定工具自动生成源代码再对其编译。在程序运行之前代理类.class文件就已经被创建了动态代理是在程序运行时通过java反射机制动态创建的。代理模式的目的代理模式主要有两个目的一保护目标对象二增强目标对象。02、静态代理模式静态代理模式的话我模拟一个古代结婚的场景。场景是这样的在古代某家的公子看上了别家的姑娘一般都是家里的大人去姑娘的家里提亲双方父母同意了然后就拜堂成婚后面要宴请亲朋好友。这里这个公子只需要拜堂成婚就行了至于提亲和宴请亲友都是父母操办的。我们用代码来模拟一下这个场景。首先我们来建个 Person 接口public interface Person {/*** 人有很对行为,这里我们用到的是结婚*/void marry();
}
然后这家公子要成亲我们建个 Son 类实现 Person 接口public class Son implements Person {Overridepublic void marry() {System.out.println(我终于结婚了);}
}
父亲帮儿子提亲,建个 Father 类:public class Father {private Son son;public Father(Son son){this.son son;}public void marry(){System.out.println(父亲上门提亲);this.son.marry();System.out.println(父亲宴请亲友);}
}
最后是测试代码public class Test {public static void main(String[] args) {Father father new Father(new Son());father.marry();}
}
输出父亲上门提亲
我终于结婚了
父亲宴请亲友
代码写完了大家有没有发现静态代理模式的一个缺点。那就是单一一个类只能代理一个目标对象。比如上面的场景父亲只能为自己的儿子提亲不能为别人家的孩子提亲。下面我们来看看动态代理是怎么解决这个问题的。03、动态代理模式动态代理模式分为 JDK 动态代理和 cglib 动态代理两种。这里先用 JDK 动态代理的方式来模拟一个通过婚介所找朋友的场景。先将 Person 接口改动下public interface Person {/*** 找朋友*/void findFriend();
}
然后是婚介所 JDKMatrimonialAgency 类public class JDKMatrimonialAgency implements InvocationHandler {//被代理的对象把引用给保存下来private Object target;public Object getInstance(Object target) throws Exception{this.target target;Class? clazz target.getClass();return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {before();Object obj method.invoke(this.target,args);after();return obj;}private void before(){System.out.println(这里是婚介所,请提供你的需求);}private void after(){System.out.println(已经找到合适的,尽快安排你相亲);}
}
JDK 动态代理主要是实现 InvocationHandler 接口并实现 invoke 方法然后创建 Customer 类public class Customer implements Person {Overridepublic void findFriend() {System.out.println(我要找一个胸大,腿长又好看的美女);}
}
最后测试类public class Test {public static void main(String[] args) {try {Person obj (Person)new JDKMatrimonialAgency().getInstance(new Customer());obj.findFriend();} catch (Exception e) {e.printStackTrace();}}
}
看下结果这里是婚介所,请提供你的需求
我要找一个胸大,腿长又好看的美女
已经找到合适的,尽快安排你相亲
然后我们用 CGLIB 来实现如果不是springspring已经集成了 CGLIB 环境需要先引入 jar 包dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.3.0/version
/dependency
然后加一个 CglibMatrimonialAgency 类public class CglibMatrimonialAgency implements MethodInterceptor {public Object getInstance(Class? clazz) throws Exception{Enhancer enhancer new Enhancer();//要把哪个设置为即将生成的新类的父类enhancer.setSuperclass(clazz);enhancer.setCallback(this);return enhancer.create();}Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)throws Throwable {//业务的增强before();Object obj methodProxy.invokeSuper(o,objects);after();return obj;}private void before(){System.out.println(这里是婚介所,请提供你的需求);}private void after(){System.out.println(已经找到合适的,尽快安排你相亲);}
}
CGLIB 主要是实现 MethodInterceptor 并实现 intercept 方法。看下结果这里是婚介所,请提供你的需求
我要找一个胸大,腿长又好看的美女
已经找到合适的,尽快安排你相亲
04、JDK和CGLIB动态代理对比JDK 动态代理是实现了被代理对象的接口CGLib 是继承了被代理对象。JDK 和 CGLib 都是在运行期生成字节码JDK 是直接写 Class 字节码CGLib 使用 ASM框架写 Class 字节码Cglib 代理实现更复杂生成代理类比 JDK 效率低。JDK 调用代理方法是通过反射机制调用CGLib 是通过 FastClass 机制直接调用方法CGLib 执行效率更高。05、代理模式的优缺点优点:降低耦合度,扩展性好代理对象将代理对象和目标对象分离,起到保护目标对象的作用可以对目标对象的功能增强缺点:增加类的数量因为会调用增强方法,所以会造成处理速度慢增加了系统的复杂度这是好的架构都会有的缺点比如spring近期热文 面试珍藏最常见的200多道Java面试题被一个熟悉的面试题问懵了String...面试官如何实现幂等性校验【END】关注下方二维码订阅更多精彩内容朕已阅