spring里面的代理是怎么实现的如

fiy 其他 20

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring中的代理是通过 AOP(面向切面编程)实现的。具体来说,Spring中的代理主要分为两种类型:JDK动态代理和CGLIB动态代理。

    1. JDK动态代理:
      JDK动态代理是基于接口实现的代理方式。它的实现依赖于Java中的java.lang.reflect包,通过提供的Proxy类和InvocationHandler接口来实现动态代理。JDK动态代理只能代理实现了接口的目标对象。

    使用JDK动态代理的步骤如下:
    (1)定义一个接口,作为代理对象的接口。
    (2)编写实现InvocationHandler接口的类,用于在代理对象方法调用前后进行操作。
    (3)使用Proxy类的newProxyInstance()方法创建代理对象。

    1. CGLIB动态代理:
      CGLIB动态代理是基于继承实现的代理方式。它通过字节码技术,生成目标类的子类作为代理对象,并重写其中的方法来实现代理。CGLIB动态代理可以代理没有实现接口的类。

    使用CGLIB动态代理的步骤如下:
    (1)引入CGLIB的相关依赖。
    (2)通过Enhancer类创建代理对象,并设置目标对象和回调方法。
    (3)通过代理对象调用方法时,会先调用回调方法。

    总结:
    Spring中的代理通过AOP实现,基于JDK动态代理和CGLIB动态代理。选择哪种代理方式,取决于目标对象是否实现了接口。如果目标对象实现了接口,就使用JDK动态代理;如果目标对象没有实现接口,就使用CGLIB动态代理。使用代理可以实现在方法调用前后进行一些公共的处理,如事务管理、日志记录等。

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

    Spring中的代理实现基于两种主要的方式:JDK动态代理和CGLIB动态代理。

    1. JDK动态代理:JDK动态代理是基于Java的反射机制实现的。它要求目标类实现一个接口,并通过标准的Java代理接口InvocationHandler来实现代理逻辑。当对目标类进行代理时,JDK动态代理会在运行时动态创建一个代理类,该代理类实现了目标类所实现的接口,并在代理类的方法中通过调用InvocationHandler的invoke方法来执行代理逻辑。JDK动态代理的优势是可适用于任何实现了接口的类,但要求目标类必须实现接口。

    2. CGLIB动态代理:CGLIB动态代理是基于字节码技术实现的。它通过继承目标类生成一个代理类,并重写了目标类的方法,将代理逻辑加入其中。CGLIB动态代理不要求目标类实现接口,因此可以代理没有实现接口的类。CGLIB动态代理的代理类和目标类是兄弟关系,因此在继承和方法调用上会比JDK动态代理更加方便和高效。

    3. 配置代理:在Spring中,可以通过配置文件或者注解的方式来配置代理。通过配置文件,可以使用aop:aspectj-autoproxy标签启用自动代理,并通过aop:config标签指定切面和通知。通过注解,可以使用@Aspect注解定义切面,并在通知方法上使用不同的注解来指定通知类型(例如@Before,@AfterReturning等)。

    4. 代理的应用:Spring中的代理主要用于AOP(面向切面编程)。AOP是一种编程范式,通过将横切关注点(例如日志记录、性能监测等)与业务逻辑解耦,提高了代码的可维护性和可重用性。通过代理,可以将通用的横切关注点封装成切面,并将切面应用到多个目标类中。

    5. 动态代理的实现原理:JDK动态代理是在运行时通过使用Java的反射机制动态生成代理类的字节码,并通过ClassLoader加载到内存中进行使用。CGLIB动态代理是通过继承的方式实现的,通过在运行时动态生成目标类的子类,并将代理逻辑加入子类的方法中。

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

    在Spring中,代理是通过AOP(面向切面编程)来实现的。AOP是一种编程范式,它允许在程序运行过程中,通过截取方法的调用来插入额外的代码。代理就是AOP的一种实现方式,它是在目标对象的基础上创建一个代理对象,通过代理对象来执行目标对象的方法。

    Spring提供了两种代理方式:基于接口的代理(JDK动态代理)和基于类的代理(CGLIB动态代理)。

    1. JDK动态代理(基于接口的代理):
      JDK动态代理通过Java的反射机制来实现,要求目标对象必须实现至少一个接口。代理对象实现了与目标对象相同的接口,并通过InvocationHandler接口来内部拦截对目标对象方法的调用。

    JDK动态代理的步骤如下:
    (1)定义目标接口:定义一个接口,该接口是目标对象实现的接口。
    (2)实现InvocationHandler接口:创建一个实现InvocationHandler接口的类,该类重写invoke()方法,在invoke()方法中进行增强逻辑的编写。
    (3)获取代理对象:使用Proxy类的newProxyInstance()方法获取代理对象,该方法接收三个参数:类加载器、目标接口数组和InvocationHandler对象。
    (4)调用代理对象:通过代理对象去调用目标对象的方法。

    1. CGLIB动态代理(基于类的代理):
      CGLIB动态代理不要求目标对象实现接口,它通过生成目标对象的子类来实现代理。代理对象继承了目标对象,通过重写方法来添加增强逻辑。

    CGLIB动态代理的步骤如下:
    (1)定义目标类:定义一个普通的Java类作为目标对象。
    (2)实现MethodInterceptor接口:创建一个实现MethodInterceptor接口的类,该类重写intercept()方法,在intercept()方法中进行增强逻辑的编写。
    (3)获取代理对象:使用Enhancer类的create()方法获取代理对象,该方法接收三个参数:目标类的类型、MethodInterceptor对象和CallbackFilter对象。
    (4)调用代理对象:通过代理对象去调用目标对象的方法。

    总结:
    Spring中的代理是通过AOP的方式实现的,基于接口的代理使用JDK动态代理,要求目标对象实现接口;基于类的代理使用CGLIB动态代理,不要求目标对象实现接口。代理对象在执行方法时,通过拦截器来添加额外的逻辑。

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

400-800-1024

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

分享本页
返回顶部