共计 1023 个字符,预计需要花费 3 分钟才能阅读完成。
- 代理模式
应用代理对象来代替对实在对象 (real object) 的拜访,这样就能够在不批改原指标对象的前提下,提供额定的性能操作,扩大指标对象的性能。
代理模式的次要作用是扩大指标对象的性能,比如说在指标对象的某个办法执行前后你能够减少一些自定义的操作。 - 动态代理
动态代理中,咱们对指标对象的每个办法的加强都是手动实现的
动态代理在编译时就将接口、实现类、代理类这些都变成了一个个理论的 class 文件。
动态代理实现步骤:
定义一个接口及其实现类;
创立一个代理类同样实现这个接口
将指标对象注入进代理类,而后在代理类的对应办法调用指标类中的对应办法。
3. 动静代理
从 JVM 角度来说,动静代理是在运行时动静生成类字节码,并加载到 JVM 中的。
3.1. JDK 动静代理机制
JDK 动静代理类应用步骤
定义一个接口及其实现类;
自定义 InvocationHandler 并重写 invoke 办法,在 invoke 办法中咱们会调用原生办法(被代理类的办法)并自定义一些解决逻辑;
通过 Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) 办法创立代理对象;
3.2. CGLIB 动静代理机制
Spring 中的 AOP 模块中:如果指标对象实现了接口,则默认采纳 JDK 动静代理,否则采纳 CGLIB 动静代理。
CGLIB 动静代理类应用步骤
定义一个类;
自定义 MethodInterceptor 并重写 intercept 办法,intercept 用于拦挡加强被代理类的办法,和 JDK 动静代理中的 invoke 办法相似;
通过 Enhancer 类的 create()创立代理类;
3.3. JDK 动静代理和 CGLIB 动静代理比照
JDK 动静代理只能只能代理实现了接口的类或者间接代理接口,而 CGLIB 能够代理未实现任何接口的类。另外,CGLIB 动静代理是通过生成一个被代理类的子类来拦挡被代理类的办法调用,因而不能代理申明为 final 类型的类和办法。
- 动态代理和动静代理的比照
灵活性:动静代理更加灵便,不须要必须实现接口,能够间接代理实现类,并且能够不须要针对每个指标类都创立一个代理类。另外,动态代理中,接口一旦新减少办法,指标对象和代理对象都要进行批改,这是十分麻烦的!
JVM 层面:动态代理在编译时就将接口、实现类、代理类这些都变成了一个个理论的 class 文件。而动静代理是在运行时动静生成类字节码,并加载到 JVM 中的。
正文完