java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > spring aop动态代理

Spring AOP 支持哪两种动态代理方式(最新推荐)

作者:冰糖心书房

动态代理在运行时创建目标对象的增强代理,Spring AOP支持JDK代理(基于接口)和CGLIB代理(基于继承),Spring Boot默认使用CGLIB解决方法自调用问题,也可通过配置切换代理方式,本文给大家介绍Spring AOP支持哪两种动态代理方式,感兴趣的朋友一起看看吧

什么是动态代理?

动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。

在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。可以理解为运行期间,对象中方法的动态拦截,在拦截方法的前后执行功能操作。

Spring AOP 支持以下两种动态代理方式:

  1. JDK 动态代理 (JDK Dynamic Proxy)
  2. CGLIB 代理 (Code Generation Library)

Spring 框架会根据你的业务对象(目标对象)的情况,智能地选择其中一种来创建代理。

1. JDK 动态代理

2. CGLIB 代理

Spring 如何选择?

这是面试中的高频问题,因为这个默认行为在不同版本中有所变化。

场景Spring 的选择
目标对象实现了接口老的 Spring 版本传统 Spring XML 配置中,默认使用 JDK 动态代理

Spring Boot (2.x 及以后) 中,为了统一行为和解决一些代理问题,默认依然使用 CGLIB
目标对象没有实现接口无论在哪个版本,都只能使用 CGLIB

为什么 Spring Boot 默认使用 CGLIB?
主要原因是为了解决“方法自调用时 AOP 失效”的问题,并提供更一致的行为。使用 CGLIB 可以确保即使目标对象实现了接口,代理的也是类本身,这在处理一些复杂的依赖注入和内部调用场景时更加可靠。

当然,你也可以通过在 application.properties 中进行配置来改变这个默认行为:

# 如果设置为 true (默认值),则统一使用 CGLIB
# 如果设置为 false,则在目标对象实现接口时,会优先使用 JDK 动态代理
spring.aop.proxy-target-class=true 

总结对比

特性JDK 动态代理CGLIB 代理
代理方式基于接口 (实现共同接口)基于继承 (创建子类)
前提条件目标对象必须实现接口目标对象不能是 final 类
性能在早期版本中,通过反射调用性能略低于 CGLIB。但在目前JDK 版本中,两者性能差距已经非常小。性能通常被认为略高,因为它直接操作字节码并调用 super
Spring Boot 默认

到此这篇关于Spring AOP 支持哪两种动态代理方式?的文章就介绍到这了,更多相关spring aop动态代理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文