Spring-AOP底层原理

发布于:2022-12-11 ⋅ 阅读:(356) ⋅ 点赞:(0)

点击->静态代理部分<-点击

点击->动态代理部分<-点击

  • 动态代理--CGLIB
  • 是什么
  • CGLIB(Code Generation Library), Code生成类库
  • CGLIB动态代理不限定是否具有接口,可以对任意操作进行增强
  • CGLIB动态代理无需要原始被代理对象,动态创建出新的代理对象
  • CGLIB是一个强大的、高性能的代码生成库
  • 其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作
  • 为什么用
  • CGLIB代理主要通过对字节码的操作,为对象引入间接级别,以控制对象的访问
  • 我们知道Java中有一个动态代理也是做这个事情的,那为什么不直接使用Java动态代理,而要使用CGLIB呢?
  • 答案是CGLIB相比于JDK动态代理更加强大
  • JDK动态代理虽然简单易用,但是其有一个致命缺陷是,只能对接口进行代理
  • 如果要代理的类为一个普通类、没有接口,那么Java动态代理就没法使用了
  • 在JDK动态代理中提供一个Proxy类来创建代理类,而在CGLib动态代理中也提供了一个类似的类Enhancer
  • CGLIB底层使用了ASM(一个短小精悍的字节码操作框架)来操作字节码生成新的类,比使用Java反射效率要高
  • 唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类
  • 与Java动态代理的区别
  • Java动态代理只能够对接口进行代理,不能对普通的类进行代理(因为所有生成的代理类的父类为Proxy,Java类继承机制不允许多重继承);
  • CGLIB能够代理普通类;
  • Java动态代理使用Java原生的反射API进行操作,在生成类上比较高效;
  • CGLIB使用ASM框架直接对字节码进行操作,在类的执行过程中比较高效
  • 织入时机
  • 编译期
    • 运行时速度快
    • 灵活性差
    • 编译即锁定
  • 加载期
    • 运行时速度快
    • 灵活性中
    • 多次加载可变更实现
  • 运行期
    • 运行时速度慢
    • 灵活性强
    • 每次运行均可改变实现
本文含有隐藏内容,请 开通VIP 后查看

网站公告


今日签到

点亮在社区的每一天
去签到