Spring Boot 中的 AOP,到底是 JDK 动态代理还是 Cglib 动态代理?
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
抽奖活动通知
周六举办了一个送书活动,中奖率较高,建议大家参与尝试运气。
正文摘要
1. Spring AOP的实现
Spring AOP底层通过动态代理实现,主要有两种方式:基于JDK的动态代理与基于Cglib的动态代理。前者需要代理对象有接口,后者则不需要。
在Spring中,如果代理的对象有接口,则默认使用JDK动态代理;没有接口,则使用Cglib动态代理。这一策略在最新版的Spring中依然适用。
2. Spring Boot中的动态代理
Spring Boot在处理动态代理问题上与Spring略有不同。在Spring Boot 2.0之前,开发者可以通过配置文件中的 spring.aop.proxy-target-class
属性来指定使用JDK代理还是Cglib代理。如果没有配置或设置为false,将使用JDK代理;如果设置为true,则使用Cglib代理。
从Spring Boot 2.0开始,如果开发者没有进行配置,默认情况下使用Cglib代理。这表示Spring Boot 2.0之后首选了Cglib动态代理。
3. 实践验证
通过创建一个简单的Spring Boot项目并运行,验证了默认情况下Spring Boot使用的是Cglib代理。通过在配置文件中添加 spring.aop.proxy-target-class=false
,可以切换到使用JDK动态代理。
4. 小结
在Spring框架中,AOP会根据是否存在接口来选择使用JDK动态代理还是Cglib动态代理。而在Spring Boot中,2.0版本之前的行为与Spring相同,2.0版本及之后则默认使用Cglib代理,除非开发者通过配置指定使用JDK代理。
想要了解更多内容?