网站服务器配置如何学习网站开发编程
1. 什么是动态代理
动态代理可以在程序运行过程中,基于反射(JDK Proxy)或字节码生成(CGLIB),为某个类动态地创建一个代理类。这个代理类会拦截对被代理类方法的调用,并在执行这些方法的前后添加自定义的处理逻辑。是不是觉得这种情况看着很熟悉?没错,spring aop以及事务管理的底层逻辑就是动态代理。
2. CGLIB(Code Generation Library,字节码生成库)
.java源文件被编译后,会生成.class文件,该文件的内容就是字节码。在程序运行过程中,CGLIB可以动态的生成或修改.class文件,以此达到动态代理的目的。
3. 基于反射和基于字节码生成的差异
基于反射:在运行时分析和调用现有类的结构(类、方法、字段)。它操作的是已经存在的、编译好的类。
基于字节码:在运行时创建全新的类或修改现有类的字节码结构。它操作的是类的定义本身。
4. CGLIB的作用
- CGLIB通过继承目标类创建代理(子类)。在实例化CGLIB代理时,目标类的构造器会像普通子类实例化一样被调用一次。CGLIB可使用该特性保证对象单例生成。
- 为无接口的类提供代理能力
- 通过直接方法调用避免反射开销
注:在spring中,当目标类实现了接口时,默认使用JDK Proxy;当目标类没有实现接口时,则使用CGLIB。也可以通过配置强制Spring始终使用CGLIB。