spring用什么代理

不及物动词 其他 33

回复

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

    Spring框架中使用的代理是基于 JDK 动态代理和 CGLib 动态代理两种方式。

    JDK 动态代理是通过接口来实现代理的机制,它要求目标类必须实现一个或多个接口。在运行时,Spring 会动态生成一个实现这些接口的代理类,并在代理类中将目标类的方法逻辑委托给了切面类来处理。使用 JDK 动态代理,可以实现接口级别的代理。

    CGLib 动态代理是以继承的方式实现代理的机制,它不需要目标类实现接口。在运行时,Spring 会生成一个目标类的子类,并将切面类的逻辑织入子类的方法中。使用 CGLib 动态代理,可以实现类级别的代理。

    在 Spring 中,使用哪种代理方式主要取决于目标类是否实现了接口。如果目标类实现了接口,则会使用 JDK 动态代理;如果目标类没有实现接口,则会使用 CGLib 动态代理。

    要使用 JDK 动态代理,需要配置 Spring 的配置文件,通过 <aop:config> 元素指定目标类和切面类,并使用 <aop:advisor> 元素指定使用的代理方式为 JDK 动态代理。

    要使用 CGLib 动态代理,需要在 Spring 的配置文件中配置 <aop:config> 元素,但不需要指定目标类实现的接口。同时,需要在目标类上添加 <aop:aspect> 注解,指定切面类。

    总的来说,Spring可以使用 JDK 动态代理和 CGLib 动态代理来实现代理,选择用哪种方式主要取决于目标类是否实现了接口。

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

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

    1. JDK动态代理:
      JDK动态代理是通过接口来实现的代理方式。当我们的目标类实现了接口时,Spring会通过JDK提供的Proxy类,在内存中动态生成一个代理类来实现目标接口,并将方法的调用委托给目标对象。JDK动态代理要求目标类实现接口,因此它只能代理实现了接口的类,在运行时生成代理类可以减少编码工作量。JDK动态代理只能代理接口中定义的方法,无法代理类中的静态方法。

    2. CGLIB代理:
      CGLIB是Code Generation Library的缩写,它是一个基于ASM(Java字节码操作框架)实现的第三方类库,可以在运行时动态生成目标类的子类,并通过方法拦截技术来进行代理。CGLIB代理不要求目标类实现接口,可以代理普通类和没有实现接口的类,因此它比JDK动态代理更加灵活。CGLIB代理通过生成目标类的子类来实现代理,因此对于final方法、private方法和static方法无法进行代理。

    3. 选择代理方式:
      在选择代理方式上,通常优先考虑JDK动态代理。原因如下:

    • JDK动态代理是Java官方提供的标准代理方式,更加可靠和稳定;
    • JDK动态代理只需要目标类实现接口,符合面向接口的设计原则;
    • JDK动态代理性能较高,不会产生过多的代理类,并且方法调用的速度比CGLIB代理更快。

    但是,如果目标类没有实现接口或者需要代理的是类中的final方法、private方法或static方法等,则需要使用CGLIB代理。

    1. 配置代理方式:
      在Spring中配置代理方式非常简单。对于JDK动态代理,可以通过在XML配置文件中使用aop:config元素来声明代理配置,并通过aop:advisor元素来指定目标类和切面类。对于CGLIB代理,只需要将代理方式设置为proxy-target-class="true"即可。

    2. AOP和代理:
      代理是实现面向切面编程(AOP)的一种方式。AOP通过在程序运行过程中动态地将额外的行为织入到目标对象中,比如日志记录、事务管理等。代理则是AOP中实现动态织入的实际工具。Spring框架中的AOP功能就是基于代理实现的,通过代理可以在目标对象的方法执行前、执行后或者抛出异常时插入额外的逻辑。

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

    在Spring框架中,用于代理对象的主要有两种方法:JDK动态代理和CGLIB代理。

    1. JDK动态代理:
      JDK动态代理是通过反射机制来实现的,它要求被代理的类必须实现一个接口。JDK动态代理使用java.lang.reflect包中的Proxy类和InvocationHandler接口来实现代理功能。
      具体步骤如下:
    2. 定义一个接口,即被代理类需要实现的接口。
    3. 创建一个InvocationHandler接口的实现类,实现invoke方法,在invoke方法中编写代理逻辑。
    4. 使用Proxy的静态方法newProxyInstance创建代理对象,传入被代理的接口类、InvocationHandler实例,得到代理对象。
    5. 通过代理对象调用方法,会调用InvocationHandler中实现的invoke方法。

    特点:

    • JDK动态代理只能代理接口,无法代理类。
    • JDK动态代理生成的代理对象是运行时创建的,每次都会动态生成一个新的代理对象。
    • JDK动态代理使用反射机制,因此相对于CGLIB代理来说,代理的效率相对较低。
    1. CGLIB代理:
      CGLIB(Code Generation Library)是一个强大的代码生成库,可以在运行时扩展Java类和实现继承,用于生成被代理对象的子类。CGLIB代理不要求被代理类实现接口,直接生成被代理类的子类。
      具体步骤如下:
    2. 引入CGLIB库的依赖。
    3. 创建Enhancer对象,设置被代理类为父类,设置回调方法为MethodInterceptor接口的实现类。
    4. 在MethodInterceptor的实现类中实现intercept方法,在方法中编写代理逻辑。
    5. 通过Enhancer对象的create方法创建代理对象。
    6. 通过代理对象调用方法,会调用MethodInterceptor中实现的intercept方法。

    特点:

    • CGLIB代理可以代理类而无需实现接口。
    • CGLIB代理生成的代理类是运行时生成的子类,因此可以覆盖非final类的final方法。
    • CGLIB代理使用ASM字节码框架直接操作字节码,相对于JDK动态代理来说,代理的效率更高。

    在Spring框架中,默认使用JDK动态代理来实现AOP(面向切面编程)的功能。当被代理的类实现了接口时,Spring会自动选择JDK动态代理。当被代理的类没有实现接口时,Spring会自动选择CGLIB代理。同时,Spring也提供了配置文件中的@EnableAspectJAutoProxy注解和aop:config标签来配置AOP的代理方式。可以通过设置proxy-target-class属性为true来强制使用CGLIB代理。

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

400-800-1024

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

分享本页
返回顶部