Spring Boot 中的 AOP,到底是 JDK 动态代理还是 Cglib 动态代理?
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
TienChin 项目的视频教程已经完成制作,采用的技术栈是 Spring Boot 和 Vue3,涵盖了许多有趣的技术点。这个项目的完成度超过了90%,诚邀大家点击链接了解更多详情。
在Java中,面向切面编程(AOP)的实现依赖于动态代理技术,分为基于 JDK 的动态代理和基于 Cglib 的动态代理。两者的主要区别在于基于 JDK 的动态代理要求被代理的对象必须实现一个接口,而基于 Cglib 的动态代理则无此要求。
在Spring框架中,动态代理的实现策略是,如果被代理的对象有接口,则优先使用 JDK 动态代理;没有接口时,则使用 Cglib 动态代理。官方文档也指出,Spring推荐首选 JDK 动态代理。
而在Spring Boot中,尤其是在版本2.0之前,通过配置文件中的 spring.aop.proxy-target-class
属性来决定使用 JDK 代理还是 Cglib 代理。默认情况下,如果没有设置该属性,则使用 JDK 代理。但从Spring Boot 2.0版本开始,默认情况下变为使用 Cglib 代理。
通过实际的编程实践,我们可以验证这些结论。通过创建一个简单的 Spring Boot 项目并进行相应的配置,可以观察到默认情况下(无配置或未明确指定)使用的是 Cglib 代理。如果想使用 JDK 代理,可以在 application.properties
中设置 spring.aop.proxy-target-class=false
。
总结来说,在Spring框架中,AOP 默认使用 JDK 动态代理,但如果被代理对象没有接口则使用 Cglib 动态代理。而在Spring Boot中,2.0 版本以前的行为与 Spring 相同,从2.0版本开始则默认使用 Cglib 代理,用户若要使用 JDK 代理则需要手动配置。
想要了解更多内容?