spring的aop代理有哪些

不及物动词 其他 11

回复

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

    Spring的AOP代理主要有两种:JDK动态代理和CGLIB代理。

    1. JDK动态代理:基于Java的反射机制,通过实现接口的方式来实现代理。JDK动态代理要求目标对象必须实现至少一个接口,并且代理对象会实现与目标对象相同的接口。当代理对象调用相应方法时,会通过反射机制调用目标对象的方法。

    2. CGLIB代理:基于字节码生产库CGLIB,通过生成目标对象的子类来实现代理。CGLIB代理不要求目标对象必须实现接口,因此可以代理非接口的类。代理对象是目标对象的子类,当代理对象调用相应方法时,会直接调用目标对象的方法。

    选择使用哪种代理方式取决于以下几个因素:

    • 目标对象是否实现接口:如果目标对象实现了接口,可以使用JDK动态代理;如果目标对象没有实现接口,可以使用CGLIB代理。
    • 性能要求:JDK动态代理利用Java的反射机制,相对而言比较慢;CGLIB代理是通过生成子类的方式,性能较高。

    在Spring中,如果目标对象实现了至少一个接口,Spring会默认使用JDK动态代理;如果目标对象没有实现接口,则会使用CGLIB代理。可以通过配置来强制使用某种类型的代理,例如使用aop:target标签指定目标对象的接口或类来决定使用哪种代理方式。

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

    Spring框架的AOP(Aspect-Oriented Programming)代理主要有三种类型:

    1. 基于JDK动态代理:这种代理方式是通过基于接口的代理实现的,使用了Java的反射机制,只能对实现了接口的类进行代理。Spring的AOP默认使用基于JDK动态代理,当目标对象实现了接口时,Spring会使用JDK动态代理来创建代理对象。

    2. 基于CGLIB的代理:这种代理方式是通过生成目标类的子类来实现的,使用了CGLIB库,可以代理没有实现接口的类。CGLIB是一个强大的字节码生成库,它通过继承目标类并重写其中的方法来创建代理对象。Spring会在目标类没有实现接口时使用CGLIB代理。

    3. 基于AspectJ的代理:这种代理方式是直接使用AspectJ框架进行代理,不依赖于Spring的AOP功能。AspectJ是一个独立的AOP框架,它提供了更强大的AOP功能和更灵活的切面定义方式。Spring支持将AspectJ与Spring框架集成,可以在Spring中使用AspectJ的注解和切点表达式。

    需要注意的是,Spring AOP默认使用的是基于接口的JDK动态代理,但当目标对象没有实现接口时,Spring会切换到使用CGLIB代理。另外,可以通过配置来强制使用CGLIB代理或者禁用CGLIB代理。

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

    Spring的AOP(Aspect-Oriented Programming)是一种面向切面编程的技术,它通过在程序中插入切面代码,实现对系统功能的增强和解耦。在Spring中,AOP代理是一种实现AOP技术的方法。

    Spring框架中提供了两种类型的AOP代理:基于JDK动态代理的代理和基于CGLIB的代理。

    1. JDK动态代理:
      JDK动态代理基于接口的代理,它使用Java的反射机制来创建代理对象。被代理的类必须实现至少一个接口。JDK动态代理的类位于java.lang.reflect包下,主要使用的类有ProxyInvocationHandler

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

    1. 创建一个实现InvocationHandler接口的代理处理类,实现invoke(Object proxy, Method method, Object[] args)方法,并自定义增强逻辑。
    2. 使用Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法创建代理对象,传入类加载器、接口数组和代理处理类。
    3. 通过代理对象调用被代理类的方法,将会触发InvocationHandlerinvoke()方法,从而执行增强逻辑。

    JDK动态代理的优点是可以代理接口,并且对于已实现接口的类,可以执行扩展功能。缺点是被代理的类必须实现至少一个接口。

    1. CGLIB代理:
      CGLIB(Code Generation Library)是一个基于ASM(Java字节码操作和分析框架)的字节码生成库,它使用一个子类来代理被代理的类,不需要被代理类实现接口。CGLIB代理的类位于org.springframework.cglib.proxy包下,使用的主要类有EnhancerMethodInterceptor

    CGLIB代理的操作流程如下:

    1. 创建一个实现MethodInterceptor接口的代理处理类,实现intercept(Object obj, Method method, Object[] args, MethodProxy proxy)方法,并自定义增强逻辑。
    2. 创建Enhancer类实例,并设置父类、回调函数(即代理处理类)。
    3. 使用enhancer.create()方法创建代理对象。
    4. 通过代理对象调用被代理类的方法,将会触发MethodInterceptorintercept()方法,从而执行增强逻辑。

    CGLIB代理的优点是可以代理没有实现接口的类,并且不需要被代理的类实现接口。缺点是由于使用CGLIB生成子类,所以对于final类和final方法无法进行代理。

    总结:Spring的AOP代理提供了两种实现方式,即基于JDK动态代理的代理和基于CGLIB的代理。通过选择合适的代理方式,可以在Spring中实现切面编程,实现系统功能的增强和解耦。

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

400-800-1024

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

分享本页
返回顶部