当前位置: 首页 > 网络应用技术

一篇文章带您了解JDK动态代理和CGLIB动态代理

时间:2023-03-07 02:32:16 网络应用技术

  1. JDK Dynamic代理:使用拦截器(必须实现调用Handler接口)加上反射机制来生成代理接口的匿名类。调用InvokeHandler在调用特定方法进行处理以处理它之前处理它

  2. CGLIB动态代理:使用ASM框架加载代理对象类生成的类文件,并修改其字节码以生成代理的子类

  所以:

  如果要实现JDK动态代理,则代理类必须实现接口,否则不能使用;

  如果要使用CGLIB Dynamic代理,则代理类无法使用最终修改类和方法。

  另外:在JDK6,JDK7和JDK8之后,逐渐优化了JDK Dynamic Agent,当呼叫数量很少时,JDK代理商的效率高于CGLIB代理效率。LOW,但是当JDK8时,JDK代理商效率高于JDK Agency效率。CGLIB代理。

  用户服务接口

  UserServiceImpl实现类

  USERPROXY代理类以实现InvocationHandler接口重写调用方法

  测试测试类

  可以看出,它已经得到增强,打印了记录日志

  CGLIB不像JDK动态代理,CGLIB需要导入JAR软件包,因此我直接使用Springboot来导入依赖项

  UserServiceImpl是代理

  Userservicecglib代理

  测试测试类

  可以看出,它已经得到增强,打印了记录日志

  在这一点上,我相信小朋友基本上已经掌握了JDK动态代理和CGLIB动态代理的差异和实现

  但是,如果是在采访中,除了回答上述要点外,您还必须回答其使用情况。这实际上是面试的额外要点。

  那么,这两种动态代理有什么用?

  答:春季aop

  以下是创建Spring AOP代理的方法

  1.如果目标对象实现接口,则默认情况下将使用JDK的动态代理

  2.如果目标对象实现接口,则还可以使用CGLIB3。如果目标对象未实现接口,则必须使用CGLIB库。

  如果您需要使用CGLIB实现AOP,则需要配置Spring.aop.proxy-tomget-class = true或@enableaspectjautoproxy(ProxyTargetClass = true)

  本文分享了华为云社区的诚意,作者:代码Pippi Shrimp。