50.JDK动态代理和CGLIB动态代理的区别

发布时间:2024年01月10日

JDK动态代理和CGLIB动态代理的区别

Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:

  • JDK动态代理只提供接口的代理,不支持类的代理
    (1)JDK会在运行时为目标类生成一个 动态代理类$proxy*.class .
    (2)该代理类是实现了接目标类接口, 并且代理类会实现接口所有的方法增强代码。
    (3)调用时 通过代理类先去调用处理类进行增强,再通过反射的方式进行调用目标方法。从而实现AOP
  • 如果代理类没有实现 接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。
    (1)CGLIB的底层是通过ASM在运行时动态的生成目标类的一个子类。(还有其他相关类,主要是为增强调用时效率) 会生成多个 ,
    (2)并且会重写父类所有的方法增强代码,
    (3)调用时先通过代理类进行增强,再直接调用父类对应的方法进行调用目标方法。从而实现AOP。
  • CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。
  • CGLIB 除了生成目标子类代理类,还有一个FastClass(路由类),可以(但不是必须)让本类方法调用进行增强,而不会像jdk代理那样本类方法调用增强会失效
  • 很多人会对比 JDK和Cglib的性能,jdk动态代理生成类速度快,调用慢,cglib生成类速度慢,但后续调用
    快,在老版本CGLIB的速度是JDK速度的10倍左右, 但是实际上J
文章来源:https://blog.csdn.net/weixin_43860634/article/details/135496598
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。