IT评测·应用市场-qidao123.com技术社区

标题: 深入解析署理模式:静态署理与动态署理的比较及JDK与CGLIB动态署理技术 [打印本页]

作者: 麻花痒    时间: 2024-7-12 11:33
标题: 深入解析署理模式:静态署理与动态署理的比较及JDK与CGLIB动态署理技术
1. 静态署理与动态署理的区别

静态署理和动态署理都是实现署理模式的方式,它们在实现上有很大的不同。下面是它们的重要区别:
实现方式不同

静态署理

静态署理是在编译期就已经确定署理对象的类型。署理类需要手动编写,并实现被署理类的接口。
动态署理

动态署理是在运行时动态天生署理对象,署理类不需要手动编写,而是由框架自动天生。Java中的动态署理通常利用Proxy类和InvocationHandler接口实现。
实用范围不同

静态署理

静态署理只实用于署理对象类型固定、接口较少的情况下。每增加一个被署理的接口,就需要编写一个新的署理类。
动态署理

动态署理可以署理恣意的接口,无需编写新的署理类,因此更加机动。实用于署理对象类型不固定、接口较多、机动性要求较高的情况。
性能体现不同

静态署理

由于静态署理在编译期就已经确定署理对象的类型,因此在运行时执行服从较高。
动态署理

动态署理在运行时需要进行额外的署理对象天生、方法调用转发等操作,因此会存在肯定的性能损失。
动态署理的类天生过程

Java假造机类加载过程重要分为五个阶段:加载、验证、准备、解析、初始化。
加载阶段

加载阶段需要完成以下三件事变:
获取类的二进制字节省的方法

总结


通过动态署理,可以根据接口或目的对象,计算出署理类的字节码,然后再加载到JVM中利用,使得署理对象的天生和方法调用更加机动和动态。
JDK动态署理和CGLIB动态署理是Java语言中实现动态署理的两种方式。它们之间的重要区别如下:
2. JDK动态署理与CGLIB动态署理的区别?

基于的技术不同

被署理类的要求不同

署理性能不同

署理方式不同

选择依据


JDK动态署理示例

  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. public interface Subject {
  5.     void request();
  6. }
  7. public class RealSubject implements Subject {
  8.     @Override
  9.     public void request() {
  10.         System.out.println("Real subject request.");
  11.     }
  12. }
  13. public class ProxyHandler implements InvocationHandler {
  14.     private Object realSubject;
  15.     public ProxyHandler(Object realSubject) {
  16.         this.realSubject = realSubject;
  17.     }
  18.     @Override
  19.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  20.         preRequest();
  21.         Object result = method.invoke(realSubject, args);
  22.         postRequest();
  23.         return result;
  24.     }
  25.     private void preRequest() {
  26.         System.out.println("Pre request processing.");
  27.     }
  28.     private void postRequest() {
  29.         System.out.println("Post request processing.");
  30.     }
  31. }
  32. public class Client {
  33.     public static void main(String[] args) {
  34.         RealSubject realSubject = new RealSubject();
  35.         Subject proxy = (Subject) Proxy.newProxyInstance(
  36.                 realSubject.getClass().getClassLoader(),
  37.                 realSubject.getClass().getInterfaces(),
  38.                 new ProxyHandler(realSubject)
  39.         );
  40.         proxy.request();
  41.     }
  42. }
复制代码
CGLIB动态署理示例

  1. import org.springframework.cglib.proxy.Enhancer;
  2. import org.springframework.cglib.proxy.MethodInterceptor;
  3. import org.springframework.cglib.proxy.MethodProxy;
  4. import java.lang.reflect.Method;
  5. public class RealSubject {
  6.     public void request() {
  7.         System.out.println("Real subject request.");
  8.     }
  9. }
  10. public class ProxyInterceptor implements MethodInterceptor {
  11.     @Override
  12.     public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
  13.         preRequest();
  14.         Object result = proxy.invokeSuper(obj, args);
  15.         postRequest();
  16.         return result;
  17.     }
  18.     private void preRequest() {
  19.         System.out.println("Pre request processing.");
  20.     }
  21.     private void postRequest() {
  22.         System.out.println("Post request processing.");
  23.     }
  24. }
  25. public class Client {
  26.     public static void main(String[] args) {
  27.         Enhancer enhancer = new Enhancer();
  28.         enhancer.setSuperclass(RealSubject.class);
  29.         enhancer.setCallback(new ProxyInterceptor());
  30.         RealSubject proxy = (RealSubject) enhancer.create();
  31.         proxy.request();
  32.     }
  33. }
复制代码
底层实现

JDK动态署理

JDK天生署理对象依赖的是反射。动态署理类对象继续了Proxy类,并且实现了被署理的所有接口。

CGLIB动态署理

CGLIB(Code Generation Library)是一个第三方代码天生类库,运行时在内存中动态天生一个子类对象从而实现对目的对象功能的扩展。CGLIB基于ASM字节码工具操作字节码(即动态天生署理,对方法进行加强)。Spring AOP(面向切面编程)基于CGLIB进行封装,实现CGLIB方式的动态署理。

总结



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4