spring用的什么代理

fiy 其他 30

回复

共3条回复 我来回复
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring框架中使用了JDK动态代理和CGLib代理两种方式。

    JDK动态代理是基于Java的反射机制实现的。它要求被代理类实现一个接口,并且代理对象是通过Proxy类的静态方法newProxyInstance()创建的。在运行时,代理对象会拦截目标对象的方法调用,并根据拦截逻辑进行处理。JDK动态代理只能代理实现了接口的类,无法代理没有实现接口的类。

    CGLib代理是基于字节码的动态代理,它通过生成目标类的子类来实现代理功能。CGLib代理不要求被代理类实现接口,它通过继承和重写父类的方法来实现代理。CGLib代理使用ASM字节码操作框架来生成和修改字节码,并通过FastClass机制来调用被代理方法。相比JDK动态代理,CGLib代理的效率较高,但对于final方法和private方法无法代理。

    在Spring框架中,JDK动态代理主要用于代理Spring容器管理的Bean,而CGLib代理主要用于代理没有实现接口的类或者被final关键字修饰的类。Spring框架会根据类的类型和配置情况自动选择合适的代理方式,并通过AOP(面向切面编程)来实现代理功能,对于开发者而言,无需关心具体的代理方式。

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

    Spring框架中使用的代理是基于Java动态代理的机制。Java动态代理是一种在运行时创建代理对象的机制,它可以实现在不修改源代码的情况下为目标对象提供额外的功能。

    在Spring框架中,使用动态代理来实现AOP(面向切面编程)功能。AOP通过将一个应用程序的横切关注点与业务逻辑分离,将横切关注点(如日志记录、事务管理等)独立于业务逻辑模块,通过动态代理的方式将其"织入"到目标对象中。

    Spring框架中使用的代理主要有两种方式:

    1. 基于接口的代理(JDK动态代理):
      JDK动态代理是Java标准库提供的一种代理方式,它要求目标对象实现一个或多个接口,动态代理对象则是通过实现这些接口来代理目标对象的方法调用。

      Spring使用JDK动态代理时,会将目标对象及需要增强的切面逻辑传递给Proxy.newProxyInstance()方法,该方法会基于目标对象的接口生成一个继承了Proxy类并实现了目标对象接口的代理类。当通过代理对象调用目标对象的方法时,实际上是调用代理类的invoke()方法,在这个方法中可以添加额外的逻辑(如前置增强、后置增强等)。

    2. 基于类的代理(CGLIB动态代理):
      CGLIB(Code Generation Library)是一个基于ASM(Abstract Syntax Tree)的Java字节码生成库,它可以在运行时动态生成指定类的子类,通过修改子类中的方法来实现代理逻辑。

      CGLIB动态代理不要求目标对象实现接口,Spring在使用CGLIB动态代理时,会生成一个继承了目标对象类的子类,通过重写父类方法来实现代理逻辑。当通过代理对象调用目标对象的方法时,CGLIB会拦截并重定向到子类中的对应方法,从而实现增强功能。

    总结起来,Spring框架中使用的代理方式主要有基于接口的代理(JDK动态代理)和基于类的代理(CGLIB动态代理),通过动态代理可以实现AOP功能,将横切关注点与业务逻辑分离。

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

    Spring框架中使用了两种代理方式:JDK动态代理和CGLIB代理。具体选择哪种代理方式取决于被代理的类是否实现了接口。

    1. JDK动态代理:
      JDK动态代理基于接口实现,利用Java的反射机制动态生成继承代理类。被代理的类必须要实现接口,代理类和被代理类实现了相同的接口。JDK动态代理主要涉及以下几个类和接口:
    • java.lang.reflect.InvocationHandler(接口):定义了代理类中的具体代理逻辑,包含一个invoke方法,当代理对象的方法被调用时,invoke方法将被调用。
    • java.lang.reflect.Proxy(类):用于生成代理对象的类,其中的newProxyInstance方法通过反射机制生成代理类的实例对象。

    使用JDK动态代理的步骤:

    1. 定义一个InvocationHandler接口的实现类,实现invoke方法并编写代理逻辑。

    2. 使用Proxy的newProxyInstance方法创建代理对象,将被代理类的实例、被代理类实现的接口、InvocationHandler的实例作为参数传入。

    3. 通过代理对象调用被代理类的方法,实际上是调用InvocationHandler的invoke方法。

    4. CGLIB代理:
      CGLIB代理方式不基于接口实现,而是通过生成被代理类的子类来实现代理。CGLIB代理允许在运行时动态生成字节码,无需被代理类实现接口。CGLIB代理主要涉及以下类和接口:

    • net.sf.cglib.proxy.MethodInterceptor(接口):定义了代理类的具体代理逻辑,包含一个intercept方法,在该方法中编写代理逻辑。
    • net.sf.cglib.proxy.Enhancer(类):用于生成代理对象的类,其中的create方法通过动态生成子类的方式生成代理类的实例对象。

    使用CGLIB代理的步骤:

    1. 定义一个MethodInterceptor接口的实现类,实现intercept方法并编写代理逻辑。
    2. 创建Enhancer的实例对象。
    3. 设置被代理类的父类(即需要代理的类)为Enhancer的父类。
    4. 设置MethodInterceptor的实例对象为Enhancer的回调。
    5. 调用Enhancer的create方法生成代理类的实例对象。
    6. 通过代理对象调用被代理类的方法,实际上是调用MethodInterceptor的intercept方法。

    总结:
    JDK动态代理是基于接口的代理实现,通过反射机制实现代理对象。CGLIB代理是基于继承的代理实现,通过生成被代理类的子类来实现代理对象。在Spring框架中,根据被代理类是否实现接口的情况,选择合适的代理方式。

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

400-800-1024

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

分享本页
返回顶部