Spring如何生成代理类

不及物动词 其他 19

回复

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

    Spring生成代理类的方式有两种:JDK动态代理和CGLIB动态代理。

    1. JDK动态代理:
      JDK动态代理是基于接口的代理方式。当目标对象实现了接口时,Spring会使用JDK的Proxy类生成代理对象。具体步骤如下:

    (1)定义接口:首先需要定义一个接口,作为代理类和目标对象的共同接口。

    (2)实现目标对象:编写目标对象的实现类,实现接口中定义的方法。

    (3)编写代理类:编写代理类,实现InvocationHandler接口,并重写invoke方法。在invoke方法中,可以进行一些前置和后置操作,比如打印日志、处理异常等。

    (4)生成代理对象:使用Proxy类的newProxyInstance方法生成代理对象。该方法需要传入目标对象的类加载器、实现的接口和代理类对象。

    1. CGLIB动态代理:
      CGLIB动态代理是基于类的代理方式。当目标对象没有实现接口时,Spring会使用CGLIB库生成代理类。具体步骤如下:

    (1)引入CGLIB库:首先需要在项目中引入CGLIB库的依赖。

    (2)定义目标对象:定义一个目标对象,即需要被代理的类。

    (3)编写代理类:编写代理类,继承MethodInterceptor接口,并重写intercept方法。在intercept方法中,可以进行一些前置和后置操作,比如打印日志、处理异常等。

    (4)生成代理对象:使用Enhancer类的create方法生成代理对象。该方法需要设置父类和代理类,并调用create方法返回代理对象。

    在配置文件或使用注解的方式下,Spring会根据配置信息或注解来生成代理类。通过以上两种方式,Spring能够灵活地生成代理类,实现AOP的功能。

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

    Spring框架使用代理来实现AOP(面向切面编程),以便在目标对象的方法执行前后插入额外的逻辑。Spring通过动态代理来生成代理类,提供了两种生成代理类的方式:基于接口的代理和基于类的代理。

    1. 基于接口的代理:Spring使用JDK的动态代理来生成基于接口的代理类。当目标对象实现了一个或多个接口时,Spring将使用JDK动态代理生成代理类。代理类实现了目标对象所实现的接口,并在执行目标方法之前或之后执行切面逻辑。

    2. 基于类的代理:当目标类没有实现任何接口时,Spring将使用CGLIB(Code Generation Library)来生成基于类的代理类。CGLIB是一个强大的第三方库,可以在运行时动态生成字节码。代理类继承了目标类,并覆盖了目标类的方法,从而在执行目标方法之前或之后执行切面逻辑。

    3. 代理生成器:Spring框架提供了ProxyFactoryBean类作为代理生成器,用来生成代理对象。该类可以配置代理的相关信息,例如目标对象、切面逻辑、代理类型等。ProxyFactoryBean通过AOP配置文件或注解来配置代理,然后在应用程序运行时动态生成代理类。

    4. 动态代理原理:JDK动态代理和CGLIB动态代理都是通过生成字节码来实现动态创建代理类的。JDK动态代理使用Proxy类和InvocationHandler接口,通过反射来创建代理类和调用目标方法。CGLIB动态代理使用Enhancer类和MethodInterceptor接口,通过字节码操作和方法拦截来创建代理类和调用目标方法。

    5. 代理类的生成过程:代理类的生成过程包括选择代理类型、创建代理类生成器、设置目标对象和切面逻辑、配置代理生成器、生成代理类。具体过程如下:

      • 选择代理类型:根据目标对象是否实现接口来选择JDK动态代理或CGLIB动态代理。
      • 创建代理类生成器:根据选择的代理类型创建对应的代理类生成器,即ProxyFactoryBean对象。
      • 设置目标对象和切面逻辑:将目标对象和切面逻辑配置到代理类生成器中。
      • 配置代理生成器:可以通过AOP配置文件或注解来配置代理类生成器的属性,例如代理类型、切面逻辑位置等。
      • 生成代理类:调用代理类生成器的getProxy()方法来生成代理类对象。

    总结起来,Spring框架通过使用JDK动态代理和CGLIB动态代理来生成代理类,实现AOP的功能。通过代理生成器配置目标对象和切面逻辑,并使用代理类生成器生成代理类。代理类在执行目标方法之前或之后执行切面逻辑。

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

    Spring生成代理类的方式主要有两种:JDK动态代理和CGLIB动态代理。

    1. JDK动态代理
      JDK动态代理是通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口实现的。它基于接口生成代理类。
      JDK动态代理的操作流程如下:
      (1)定义接口:首先要定义一个接口,该接口是目标对象实现的接口。
      (2)实现InvocationHandler接口:创建一个实现InvocationHandler接口的类,该类负责增强原始对象的方法。
      (3)创建代理对象:使用Proxy类的静态方法newProxyInstance()创建代理对象,该方法接收三个参数:ClassLoader,interfaces和InvocationHandler。
      (4)调用代理对象的方法:通过代理对象调用方法时,实际上是调用InvocationHandler的invoke()方法,然后再调用目标对象的方法。

    2. CGLIB动态代理
      CGLIB动态代理是通过类继承实现的,它不仅可以代理接口,还可以代理类。
      CGLIB动态代理的操作流程如下:
      (1)定义目标类:首先要定义一个目标类(被代理类),该类需要被增强。
      (2)实现MethodInterceptor接口:创建一个类实现MethodInterceptor接口,该类负责对原始对象的方法进行增强。
      (3)创建Enhancer对象:使用Enhancer类创建代理对象,该类提供了一种简单的方式来创建CGLIB代理对象,可以设置目标类和方法拦截器。
      (4)调用代理对象的方法:通过代理对象调用方法时,会先调用MethodInterceptor的intercept()方法,然后再调用目标对象的方法。

    需要注意的是,JDK动态代理只能代理接口,而CGLIB动态代理既可以代理接口也可以代理类。在选择使用哪种代理方式时,可以根据具体需求来决定。如果被代理的对象是一个接口,就使用JDK动态代理;如果被代理的对象是一个类,就使用CGLIB动态代理。

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

400-800-1024

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

分享本页
返回顶部