spring用的什么动态代理

worktile 其他 18

回复

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

    在Spring框架中,主要使用了两种动态代理技术:JDK动态代理和CGLIB动态代理。

    JDK动态代理是指通过Java提供的java.lang.reflect.Proxy类来实现的动态代理。JDK动态代理要求目标类必须实现一个或多个接口,通过在运行时创建一个实现了目标接口的代理类对象,来实现对目标对象的代理。JDK动态代理的原理是基于接口的动态代理,代理类是实现了目标接口的代理对象。优点是生成的代理类不需要依赖第三方库,缺点是只能对实现了接口的类进行代理。

    CGLIB动态代理是指通过CGLIB(Code Generation Library)库来实现的动态代理。CGLIB是一个强大的、高性能的代码生成库,可以在运行时动态的生成指定类的子类,通过继承的方式实现代理。CGLIB动态代理的原理是通过生成目标类的子类来实现代理,代理类是目标类的子类对象。相比于JDK动态代理,CGLIB动态代理可以对没有实现接口的类进行代理,更加灵活。但是由于生成的代理类是通过继承的方式实现代理,所以对final类和final方法无法代理。

    在Spring框架中,当目标类实现了接口时,会优先使用JDK动态代理;当目标类没有实现接口时,会使用CGLIB动态代理。这样可以根据不同的情况选择合适的动态代理方式来生成代理对象。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring使用的是JDK动态代理和CGLIB动态代理两种技术。

    1. JDK动态代理:JDK动态代理是Java提供的一种动态代理技术。它基于接口进行代理,并利用Java的反射机制在运行时动态地创建代理类和代理对象。JDK动态代理要求被代理的类或接口必须实现一个或多个接口,然后通过Proxy.newProxyInstance()方法创建代理对象。

    2. CGLIB动态代理:CGLIB动态代理是基于CGLIB库实现的,它能够代理任意的类,包括没有实现接口的类。CGLIB动态代理通过生成被代理类的子类,并重写被代理方法来实现代理功能。CGLIB动态代理更加灵活,但由于使用了字节码生成技术,所以相对于JDK动态代理来说在性能上略低一些。

    3. Spring AOP使用JDK动态代理:当被代理的对象实现了一个或多个接口时,Spring AOP默认使用JDK动态代理。它通过实现InvocationHandler接口,并重写invoke()方法来实现对代理类方法的增强。

    4. Spring AOP使用CGLIB动态代理:当被代理的对象没有实现接口或不可修改时,Spring AOP会使用CGLIB动态代理。它通过生成被代理类的子类,并重写被代理方法来实现对代理类方法的增强。

    5. 配置Spring AOP的动态代理方式:在Spring的配置文件中,可以通过配置aop:config元素来配置动态代理方式。通过设置aop:config的proxy-target-class属性值为true,则强制使用CGLIB动态代理;反之,值为false(或不设置)时,则使用JDK动态代理。

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

    Spring框架在实现动态代理时主要使用了JDK动态代理和CGLIB动态代理两种方式。

    1. JDK动态代理:
      JDK动态代理是Java提供的一种基于接口的动态代理技术。它通过在运行时创建代理类和代理实例来实现代理功能。JDK动态代理要求被代理的类必须实现一个或多个接口。

    JDK动态代理的核心类是java.lang.reflect.Proxy,通过Proxy类的newProxyInstance方法可以创建代理对象。创建代理对象需要三个参数:ClassLoader、Interface和InvocationHandler。

    • ClassLoader:指定当前代理类使用的类加载器。
    • Interfaces:代理类需要实现的接口列表。
    • InvocationHandler:定义代理类中需要增强的方法逻辑。

    JDK动态代理的操作流程如下:

    1. 定义接口:定义代理类需要实现的接口。

    2. 实现InvocationHandler接口:创建一个实现InvocationHandler接口的类,该类中实现invoke方法,在invoke方法中定义对被代理类方法的增强逻辑。

    3. 创建代理对象:使用Proxy类的newProxyInstance方法创建代理对象,传入ClassLoader、Interfaces和InvocationHandler对象。

    4. 调用代理方法:通过代理对象调用方法,实际上会执行InvocationHandler中的invoke方法,并在其中执行增强逻辑。

    5. CGLIB动态代理:
      CGLIB(Code Generation Library)是一个开源的第三方代码生成库,它可以在运行时生成Java字节码并动态加载到JVM中。CGLIB动态代理可以代理没有实现接口的类。

    CGLIB动态代理的核心类是net.sf.cglib.proxy.Enhancer,通过Enhancer类可以生成代理对象。创建代理对象需要两个参数:被代理类的Class对象和MethodInterceptor对象。

    • Class对象:被代理类的Class对象。
    • MethodInterceptor对象:定义代理类中需要增强的方法逻辑。

    CGLIB动态代理的操作流程如下:

    1. 定义被代理类:定义一个普通类作为被代理类。
    2. 实现MethodInterceptor接口:创建一个实现MethodInterceptor接口的类,该类中实现intercept方法,在intercept方法中定义对被代理类方法的增强逻辑。
    3. 创建Enhancer对象:使用Enhancer类的create方法创建Enhancer对象,设置被代理类的Class对象和MethodInterceptor对象。
    4. 创建代理对象:通过Enhancer对象的create方法创建代理对象。
    5. 调用代理方法:通过代理对象调用方法,实际上会执行MethodInterceptor中的intercept方法,并在其中执行增强逻辑。

    JDK动态代理和CGLIB动态代理的选择:

    • 如果被代理的类实现了接口,推荐使用JDK动态代理,因为JDK动态代理性能较高。
    • 如果被代理的类没有实现接口,或者需要对类的非final方法进行代理,可以使用CGLIB动态代理。

    在Spring框架中,当被代理的类实现了接口时,Spring会默认使用JDK动态代理;当被代理的类没有实现接口时,Spring会使用CGLIB动态代理。同时,Spring也提供了配置选项,可以手动指定使用哪种动态代理方式。

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

400-800-1024

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

分享本页
返回顶部