spring用的是什么动态代理

不及物动词 其他 27

回复

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

    Spring使用的是JDK动态代理和CGLIB动态代理两种方式。

    1. JDK动态代理:JDK动态代理是基于接口的代理实现,通过Java原生的java.lang.reflect包中的Proxy和InvocationHandler实现。JDK动态代理要求被代理对象实现至少一个接口。在运行时,JDK动态代理可以在不修改原始类的情况下,实现对目标类的方法进行拦截和增强,可以实现一些横切关注点的功能,比如日志记录、事务管理等。其缺点是只能代理实现了接口的类,无法代理没有实现接口的类。

    2. CGLIB动态代理:CGLIB(Code Generation Library)动态代理是通过继承目标类,动态生成一个子类来实现的。CGLIB动态代理不要求目标类实现接口,可以代理任何类。CGLIB动态代理使用字节码处理框架ASM来转换目标类的字节码,生成子类并重写了被代理方法,添加了相应拦截逻辑。CGLIB动态代理的性能比JDK动态代理更高,但生成的代理类会比较大,影响初始加载和执行速度。

    在Spring中,默认情况下,如果被代理对象实现了至少一个接口,Spring会使用JDK动态代理;如果没有实现接口,或者明确指定使用CGLIB动态代理,Spring会使用CGLIB动态代理。可以通过配置选项进行切换动态代理方式。此外,Spring AOP也支持使用AspectJ来实现代理。

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

    Spring使用的是基于Java反射机制的JDK动态代理。

    1. 动态代理是一种在运行时创建代理对象的方法。它允许在不修改原始类的情况下,为其添加额外的逻辑。

    2. JDK动态代理是由Java语言提供的一种动态代理机制,它基于接口实现。通过反射机制动态生成代理类和代理对象,实现对被代理对象的方法调用的拦截和增强。

    3. 在Spring中,动态代理主要用于实现AOP(面向切面编程)。通过在运行时生成代理类,Spring可以在原始类的方法调用前、后或中间插入额外的逻辑,如日志记录、性能监控、权限控制等。

    4. JDK动态代理主要通过Proxy类和InvocationHandler接口来实现。Proxy类提供了创建代理对象的方法,而InvocationHandler接口允许在代理对象的方法调用前后执行额外的逻辑。

    5. JDK动态代理有一个限制,即只能代理实现了接口的类。对于没有实现接口的类,可以使用其他的动态代理技术,如CGLIB(Code Generation Library)动态代理。CGLIB动态代理通过继承的方式来创建代理对象,并覆盖原始类的方法,实现对方法调用的拦截和增强。在Spring中,如果需要代理的对象没有实现接口,Spring会自动切换到使用CGLIB动态代理。

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

    Spring框架默认使用的是基于接口的JDK动态代理。在使用AOP时,Spring会基于JDK动态代理或CGLIB动态代理来生成代理对象。

    1. JDK动态代理:
      JDK动态代理是Java提供的一种动态代理实现方式,它要求目标类必须实现至少一个接口。Spring通过Java的反射机制,在运行时动态地创建一个实现了目标类接口的代理类,代理类持有目标类的引用。在调用代理类的方法时,会委托给目标类的同名方法执行前后增强逻辑。JDK动态代理是Spring AOP的首选代理方式。

    2. CGLIB动态代理:
      CGLIB动态代理是基于字节码生成技术的动态代理实现方式,它能够在运行时动态地生成一个继承了目标类的子类作为代理类。对于没有实现任何接口的目标类,Spring会选择CGLIB动态代理生成代理对象。CGLIB动态代理通过继承的方式进行代理,因此可以实现对目标类所有非final方法的代理。

    Spring在选择动态代理方式时会根据目标类是否实现接口来进行判断,如果实现了接口,则选择JDK动态代理;如果没有实现接口,则选择CGLIB动态代理。但也可以通过配置来强制使用某种代理方式。

    在配置文件中使用aop:config来定义切面,并通过aop:advisoraop:aspect来指定切入点、增强类型和增强逻辑。Spring会根据配置信息自动为目标类生成代理对象,并在方法调用前后执行相应的增强逻辑。

    总结:Spring框架默认使用的是基于接口的JDK动态代理,并在必要时使用CGLIB动态代理来实现AOP的功能。

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

400-800-1024

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

分享本页
返回顶部