spring底层用的什么动态代理

fiy 其他 20

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring底层使用的动态代理主要有两种方式:JDK动态代理和CGLIB动态代理。

    JDK动态代理是基于接口的代理,它利用Java的反射机制,在运行时生成一个实现了目标接口的代理类,通过代理类来调用目标对象的方法。JDK动态代理要求目标对象实现一个接口,然后代理对象就可以实现该接口,从而在调用接口方法时进行拦截和增强。

    CGLIB动态代理则是基于继承的代理,它不要求目标对象实现接口。CGLIB动态代理通过生成一个目标类的子类,并在子类中覆盖需要代理的方法,通过继承来实现代理。CGLIB动态代理在运行时对目标对象进行字节码增强,因此可以代理那些没有实现接口的类。

    在Spring框架中,默认情况下,如果目标对象实现了接口,则使用JDK动态代理;如果目标对象没有实现接口,则使用CGLIB动态代理。同时,Spring也提供了配置方式来强制使用某种类型的动态代理。

    总结来说,Spring底层使用的动态代理主要有JDK动态代理和CGLIB动态代理两种方式,通过这两种方式可以实现对目标对象方法的拦截和增强。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    在Spring框架中,底层使用了两种类型的动态代理:JDK动态代理和CGLIB动态代理。

    1. JDK动态代理:
      JDK动态代理是Java标准库中提供的一种动态代理方式。它通过接口实现的方式实现代理。JDK动态代理要求被代理对象必须实现一个接口,然后通过InvocationHandler接口的实现类来生成代理对象。JDK动态代理主要是通过反射机制实现的。在Spring中,JDK动态代理主要应用在基于接口的AOP(面向切面编程)中。

    2. CGLIB动态代理:
      CGLIB动态代理是通过字节码技术实现的一种动态代理方式。它不要求被代理对象实现接口,通过继承被代理对象的方式进行代理。CGLIB动态代理主要是通过生成一个被代理类的子类,并且重写需要代理的方法来实现的。CGLIB动态代理更加灵活,支持对类的任何方法进行拦截和增强。在Spring中,CGLIB动态代理主要应用在基于类的AOP中。

    3. 选择JDK动态代理还是CGLIB动态代理:
      在Spring中,选择使用JDK动态代理还是CGLIB动态代理取决于被代理对象是否实现了接口。如果被代理对象实现了接口,Spring将使用JDK动态代理;如果被代理对象没有实现接口,Spring将使用CGLIB动态代理。

    4. 动态代理的应用场景:
      动态代理主要用于实现AOP,即在原有对象的基础上进行增强操作。典型的应用场景包括日志记录、事务管理、性能监控等。通过动态代理,可以将这些公共的功能抽象出来,然后在需要的地方进行配置和调用,从而避免了代码的冗余和重复。

    5. 动态代理的优点:
      动态代理具有以下优点:

    • 简化了代码结构,将公共的代码逻辑抽取出来,使得代码更加清晰和易于维护。
    • 可以在不修改原有代码的情况下增加新的功能,提高了代码的灵活性和可扩展性。
    • 动态代理可以在运行时对方法进行增强和拦截,使得程序的功能更加强大且具有更好的可控性。
    • 提高了代码的复用性,可以将一些常见的功能通过动态代理进行封装,然后在不同的场景中重复使用。
    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring底层主要使用了Java的动态代理来实现对Bean的代理控制。具体来说,Spring底层使用了两种不同的动态代理方式:基于接口的动态代理和基于子类的动态代理。

    基于接口的动态代理是通过Java的标准库中的java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口实现的。该方式要求被代理的类必须实现一个接口,代理类动态生成一个实现了该接口的代理类,然后通过该代理类调用原始类的方法。在调用代理类的方法时,会通过InvocationHandler接口的实现类来处理实际的方法调用。

    基于子类的动态代理是通过CGLIB(Code Generation Library)实现的,CGLIB是一个强大的高性能的代码生成库,底层使用ASM(一个 Java 字节码操作框架)来生成代理类。该方式不要求被代理的类必须实现接口,通过生成目标类的子类来实现代理。代理类继承自目标类,重写目标类中的方法,并在方法的前后插入增强代码。

    在Spring中,如果被代理的Bean实现了至少一个接口,Spring会默认使用基于接口的动态代理来创建代理对象。如果被代理的Bean没有实现任何接口,Spring会使用基于子类的动态代理来创建代理对象。如果希望强制使用基于接口的动态代理或基于子类的动态代理,可以通过配置相应的AOP代理方式来实现。

    总结起来,Spring底层使用了基于接口的动态代理和基于子类的动态代理来实现对Bean的代理控制,使得AOP的功能可以灵活而高效地应用于Spring框架中。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部