spring用的什么代理模式

worktile 其他 27

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring框架使用了JDK动态代理和CGLIB代理两种代理模式。

    1. JDK动态代理(基于接口的代理):
      JDK动态代理是通过Proxy类和InvocationHandler接口实现的。在运行时,动态生成代理类并将方法调用转发给InvocationHandler接口的invoke方法。需要注意的是,被代理的类必须实现至少一个接口。JDK动态代理适用于对接口进行代理的情况。

    2. CGLIB代理(基于继承的代理):
      CGLIB(Code Generation Library)是一个开源的字节码生成库,可以在运行时生成代理类。CGLIB代理不需要目标类实现接口,它是通过生成目标类的子类,并覆盖其中的方法来实现代理。CGLIB代理适用于对类进行代理的情况。

    Spring在使用代理模式时会根据被代理对象是否实现了接口来决定采用哪种代理方式。如果目标对象实现了接口,则使用JDK动态代理;如果目标对象没有实现接口,则使用CGLIB代理。

    总结:
    Spring框架使用JDK动态代理和CGLIB代理来实现AOP(面向切面编程)和事务管理等功能。通过代理模式,Spring可以在目标对象的方法执行前后加入自定义的逻辑,实现了对目标对象的控制和增强。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring框架使用的代理模式主要包括静态代理和动态代理两种。

    1. 静态代理:
      静态代理是通过在代码编译阶段就已经确定了代理对象的方式。在Spring框架中,通常使用手动编写代理类来实现静态代理。静态代理需要为每个被代理对象编写一个代理类,并在代理类中实现与被代理对象相同的接口。静态代理适用于被代理对象较少且变动不频繁的情况,例如权限验证、日志记录等。

    2. 动态代理:
      动态代理是在运行时动态地创建代理对象的方式。Spring框架中主要使用了JDK动态代理和CGLIB动态代理两种方式来实现动态代理。

    • JDK动态代理利用Java的反射机制,在运行时创建代理类和代理对象。JDK动态代理要求被代理对象实现一个接口,并通过Proxy类和InvocationHandler接口实现代理逻辑。JDK动态代理适用于接口代理的情况,例如AOP(面向切面编程)。
    • CGLIB动态代理利用字节码生成技术,在运行时动态生成被代理对象的子类。CGLIB动态代理不要求被代理对象实现接口,而是通过继承和重写方法的方式实现代理逻辑。CGLIB动态代理适用于类代理的情况,例如Spring中的事务处理。
    1. 代理模式的优点:
    • 静态代理和动态代理可以降低业务代码的耦合度,将一些通用的非业务逻辑(如权限验证、事务处理、日志记录等)与业务逻辑分离,使得代码更加清晰和可维护。
    • 代理模式可以实现横切关注点的代码重用,提高了代码的复用性。
    • 动态代理可以在运行时动态地代理不同的对象,使得系统更加灵活和可扩展。
    1. Spring框架中的代理模式应用:
      Spring框架中的代理模式主要应用于AOP(面向切面编程)的实现。在Spring中,通过配置文件或注解方式,可以定义切面(Aspect)来捕获程序运行过程中的特定事件。Spring通过动态代理来织入切面逻辑到业务逻辑中,实现了事务管理、安全验证、日志记录等跨越多个对象的功能。Spring默认使用JDK动态代理来实现面向接口的代理,当被代理对象没有接口时,会自动切换到使用CGLIB动态代理。
    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    在Spring框架中,主要使用了两种代理模式:JDK动态代理和CGLIB(Code Generation Library)代理。

    1. JDK动态代理:
      JDK动态代理是基于接口的代理模式。当一个类实现了接口时,可以使用JDK动态代理来创建代理对象。它是通过反射机制在运行时创建一个实现代理接口的匿名类来实现的。JDK动态代理要求目标类实现至少一个接口。

    JDK动态代理的步骤:
    a. 创建一个实现InvocationHandler接口的类,它负责实现代理的逻辑。这个类中需要持有一个被代理的对象的引用,在invoke方法里面调用被代理对象的方法。
    b. 使用Proxy类的newProxyInstance方法创建代理对象。该方法接收三个参数:ClassLoader对象(指定代理对象使用的类加载器),一个Class数组(指定代理对象所实现的接口)和一个InvocationHandler对象(指定代理对象的调用处理器)。
    c. 通过代理对象来调用目标方法。

    JDK动态代理的优点是可以在运行时动态地创建代理对象,无需提前定义接口。缺点是只能代理实现了接口的类。

    1. CGLIB代理:
      CGLIB代理是基于继承的代理模式。CGLIB可以代理没有实现接口的类。它通过继承被代理类并重写其方法来实现代理。

    CGLIB代理的步骤:
    a. 创建一个类,继承被代理类,即目标类。
    b. 创建一个实现MethodInterceptor接口的类,它负责实现代理的逻辑。在intercept方法里面调用被代理对象的方法。
    c. 使用Enhancer类创建代理对象,并设置目标类对象和MethodInterceptor接口实例。
    d. 通过代理对象来调用目标方法。

    CGLIB代理的优点是可以代理没有实现接口的类。缺点是无法代理final类和final方法。

    在Spring框架中,当Bean被声明为要使用AOP(面向切面编程)时,Spring会根据目标类是否有实现的接口来决定使用JDK动态代理还是CGLIB代理。如果目标类实现了接口,则使用JDK动态代理;如果目标类没有实现接口,则使用CGLIB代理。

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

400-800-1024

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

分享本页
返回顶部