spring使用什么代理

不及物动词 其他 38

回复

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

    Spring使用JDK动态代理和CGLIB代理两种代理方式。

    JDK动态代理是Spring默认使用的代理方式。它是通过Java的反射机制实现的,仅支持接口类型的代理,并且被代理的目标对象必须实现至少一个接口。 JDK动态代理在运行时动态地创建代理类和代理对象,并通过代理对象调用目标对象的方法。JDK动态代理的优势是代理过程完全透明,无需手动创建代理类和对象。但是由于是接口代理,因此无法对目标类中的final方法和private方法进行代理。

    CGLIB代理是一种基于字节码技术实现的代理方式。它能够代理普通的类,而不仅仅局限于接口。CGLIB代理通过继承的方式实现,它在运行时通过字节码生成技术创建一个目标对象的子类,子类重写了目标对象的非final方法,并在重写的方法中进行增强处理。相比于JDK动态代理,CGLIB代理可以代理接口和普通类,而且不受final方法和private方法的限制。

    Spring在选择代理方式时有一定的规则。当被代理的类实现了接口时,则默认使用JDK动态代理;而当被代理的类没有实现任何接口时,则会使用CGLIB代理。但是Spring也提供了配置的方式来指定使用哪种代理方式,可以通过在配置文件中进行设置。

    综上所述,Spring使用JDK动态代理和CGLIB代理两种代理方式来实现目标类的代理。根据被代理的类是否实现了接口来选择使用哪种代理方式。

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

    在Spring框架中,可以使用两种类型的代理来实现AOP(面向切面编程):JDK动态代理和CGLIB代理。

    1. JDK动态代理:
      JDK动态代理是基于接口的代理,通过Java的反射机制来实现代理功能。在运行时动态地创建代理对象,该代理对象实现了目标对象所实现的一组接口。JDK动态代理要求目标对象必须实现至少一个接口,然后使用Proxy类中的静态方法newProxyInstance创建一个代理对象,并传入目标对象和InvocationHandler接口的实现类。

    2. CGLIB代理:
      CGLIB(Code Generation Library)代理是基于字节码的代理,通过生成目标对象的子类来实现代理功能。CGLIB代理不要求目标对象实现接口,通过继承目标对象创建子类,并重写目标对象的方法来实现代理逻辑。CGLIB代理使用字节码增强库来拦截方法调用,并在被拦截的方法中加入切面逻辑。

    3. 动态选择代理方式:
      Spring框架在配置AOP时,会根据目标对象的类型自动选择合适的代理方式。如果目标对象实现了至少一个接口,Spring会使用JDK动态代理,否则会使用CGLIB代理。

    4. 配置JDK动态代理:
      在Spring配置文件中,使用aop:config元素配置AOP代理时,可以通过aop:proxy元素的proxy-target-class属性来指定是否使用CGLIB代理。将属性值设置为true时,强制使用CGLIB代理;将属性值设置为false或者不设置时,则使用JDK动态代理。

    5. 配置CGLIB代理:
      如果希望强制使用CGLIB代理,可以在Spring配置文件中使用<aop:config proxy-target-class="true">来配置AOP代理。这样就会始终使用CGLIB代理,即使目标对象实现了接口。但值得注意的是,使用CGLIB代理可能会带来一些性能损耗,因为CGLIB代理是通过子类继承实现的。所以在选择代理方式时,需要根据具体的情况进行权衡和选择。

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

    Spring框架在代理方面主要使用了两种技术,分别是JDK动态代理和CGLIB代理。

    1. JDK动态代理
      JDK动态代理是Spring框架自带的一种代理实现方式,它是通过Java的反射机制来实现的。JDK动态代理只能对实现了接口的类进行代理,它通过Proxy类和InvocationHandler接口来生成代理对象。具体的操作流程如下:
    • 首先,定义一个实现InvocationHandler接口的类,该类中有一个invoke方法,该方法会在代理对象的方法被调用时执行。
    • 其次,通过Proxy类的静态方法newProxyInstance()来创建代理对象,该方法需要传入一个ClassLoader对象、一组接口和一个InvocationHandler对象。
    • 最后,通过代理对象调用方法时,会自动调用InvocationHandler对象的invoke方法来进行处理。
    1. CGLIB代理
      CGLIB代理是一种基于字节码的动态代理技术,它通过生成目标类的子类来实现代理。与JDK动态代理不同,CGLIB代理可以对任意类进行代理,而不需要实现接口。具体的操作流程如下:
    • 首先,定义一个实现MethodInterceptor接口的类,该类中有一个intercept方法,该方法会在代理对象的方法被调用时执行。
    • 其次,通过Enhancer类的create()方法来创建代理对象,该方法需要设置目标类和MethodInterceptor对象。
    • 最后,通过代理对象调用方法时,会自动调用MethodInterceptor对象的intercept方法来进行处理。

    需要注意的是,Spring框架在选择使用JDK动态代理还是CGLIB代理时会根据条件自动进行判断。当目标类实现了接口时,Spring会使用JDK动态代理;当目标类没有实现接口时,Spring会使用CGLIB代理。但是,我们也可以通过配置来强制指定使用某种代理方式。例如,在配置文件中使用<aop:aspectj-autoproxy proxy-target-class="true"/>来强制使用CGLIB代理。

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

400-800-1024

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

分享本页
返回顶部