侧边栏壁纸
博主头像
为了吃方便面

人类的悲欢并不相通,我只觉得他们吵闹。

  • 累计撰写 16 篇文章
  • 累计创建 13 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

[Core]Spring AOP

为了吃方便面
2022-06-14 / 0 评论 / 1 点赞 / 345 阅读 / 413 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-06-14,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

在 Spring 中 AOP 代理使用 JDK 动态代理和 CGLIB 代理来实现,默认如果目标对象是接口,则使用 JDK 动态代理,否则使用 CGLIB 来生成代理类。


JDK 动态代理机制只能对接口进行代理,其原理是动态生成一个代理类,这个代理类实现了目标对象的接口,目标对象和代理类都实现了接口,但是目标对象和代理类的 Class 对象是不一样的,所以两者是没法相互赋值的。

206BA29C-CC20-4F5D-82FE-1B9526BB21FA


CGLIB 是对目标对象本身进行代理,所以无论目标对象是否有接口,都可以对目标对象进行代理,其原理是使用字节码生成工具在内存生成一个继承目标对象的代理类,然后创建代理对象实例。
由于代理类的父类是目标对象,所以代理类是可以赋值给目标对象的,自然如果目标对象有接口,代理对象也是可以赋值给接口的。
CGLIB 动态代理中生成的代理类的字节码相比 JDK 来说更加复杂。

88100F8E-24B3-4848-B36D-FB1453C5D532

总的来说: JDK 使用反射机制调用目标类的方法,CGLIB 则使用类似索引的方式直接调用目标类方法,所以 JDK 动态代理生成代理类的速度相比 CGLIB 要快一些,但是运行速度比 CGLIB 低一些,并且 JDK 代理只能对有接口的目标对象进行代理。

1

评论区