spring什么时候创建代理对象

worktile 其他 127

回复

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

    Spring在创建代理对象的时机有两种情况:一种是在Bean的实例化的时候,另一种是在Bean的方法调用时。

    1. 当Bean的实例化阶段,Spring会根据配置的代理方式创建代理对象。如果使用的是基于接口的代理方式(默认情况),Spring会在Bean的实例化阶段通过JDK动态代理来创建代理对象。具体地说,Spring会检查目标Bean的是否实现了接口,如果实现了接口,Spring会使用JDK动态代理来生成一个实现了这些接口的代理对象。

    2. 当Bean的方法被调用时,Spring会在需要的时候动态地创建代理对象。例如,当使用AOP拦截器对方法进行拦截时,Spring会在方法调用前后,或者抛出异常时,动态地创建代理对象,并在适当的时候执行拦截逻辑。

    需要注意的是,如果使用的是基于类的代理方式,即CGLIB代理,Spring会在Bean的实例化阶段使用CGLIB库创建一个继承自目标类的子类作为代理对象。

    总结来说,Spring在Bean的实例化阶段根据配置的代理方式创建代理对象,在方法调用时动态地创建代理对象,并在适当的时候执行拦截逻辑。

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

    Spring在什么时候创建代理对象主要取决于两个因素:AOP配置和目标对象的类型。

    1. 配置:Spring使用AspectJ和动态代理两种方式实现AOP。在AspectJ方式下,代理是通过编译时织入实现的,因此代理对象在应用启动时就已经创建好了。而在动态代理方式下,代理对象是在运行时动态生成的,因此代理对象是在方法被调用时才被创建。

    2. 目标对象的类型:如果目标对象是接口类型,则Spring使用JDK动态代理创建代理对象,而如果目标对象是类类型,则Spring使用CGLIB动态代理创建代理对象。

    根据以上两个因素,Spring创建代理对象的具体时机如下:

    1. AspectJ方式:代理对象在应用启动时就已经创建好了,无论目标对象是接口类型还是类类型。

    2. JDK动态代理:如果目标对象是接口类型,则在应用启动时创建代理对象。因为JDK动态代理是基于接口实现的,所以只能代理接口类型的对象。

    3. CGLIB动态代理:如果目标对象是类类型,则在第一次调用代理对象的时候才会创建代理对象。因为CGLIB动态代理是基于继承实现的,所以可以代理任意类类型的对象。

    总结起来,Spring在应用启动时就已经创建好AspectJ方式的代理对象,而在运行时动态生成JDK动态代理和CGLIB动态代理的代理对象。同时,JDK动态代理只能代理接口类型的对象,而CGLIB动态代理可以代理任意类类型的对象。

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

    在Spring框架中,代理对象的创建取决于所使用的AOP(面向切面编程)实现方式。Spring支持两种主要的AOP实现方式:JDK动态代理和CGLIB代理。

    1. JDK动态代理:
      JDK动态代理是通过反射机制在运行时创建代理对象。当目标对象实现了至少一个接口时,Spring会使用JDK动态代理来创建代理对象。
      使用JDK动态代理创建代理对象的步骤如下:

      • 定义切面逻辑:编写一个实现了InvocationHandler接口的切面类,该接口中只有一个方法invoke();
      • 配置切面和目标对象:在Spring的配置文件中,使用标签配置切面和目标对象;
      • 创建代理对象:通过Proxy工具类的newProxyInstance()方法创建代理对象;
      • 使用代理对象:通过代理对象调用业务方法。

    在使用JDK动态代理时,代理对象是在运行时通过反射机制动态生成的,所以在每次调用被代理方法时都会创建新的代理对象。

    1. CGLIB代理:
      当目标对象没有实现接口或无法满足代理条件时,Spring会使用CGLIB代理来创建代理对象。CGLIB是一个强大的高性能的代码生成库,通过创建一个目标对象的子类来实现代理。

    使用CGLIB代理创建代理对象的步骤如下:

    • 定义切面逻辑:编写一个切面类,该类无需实现任何接口;
    • 配置切面和目标对象:在Spring的配置文件中,使用标签配置切面和目标对象;
    • 创建代理对象:Spring会自动使用CGLIB动态创建代理对象;
    • 使用代理对象:通过代理对象调用业务方法。

    在使用CGLIB代理时,代理对象是在运行时动态生成的目标对象的子类,所以只会创建一次。

    总结起来,Spring在创建代理对象时,会根据目标对象是否实现接口来决定使用JDK动态代理还是CGLIB代理。如果目标对象实现了接口,那么使用JDK动态代理;如果目标对象没有实现接口或无法满足代理条件,那么使用CGLIB代理。

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

400-800-1024

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

分享本页
返回顶部