为什么 spring AOP 使用 JDK 动态代理?

why spring AOP use JDK Dynamic proxy?

我知道 Spring AOP 使用 JDK 动态代理和 CGLIB。

当目标实现接口时 -> JDK 动态代理

其他 -> CGLIB。

大家可以看到为什么之前的版本会有这个原因,目前CGLIB的缺点都被解决了,而且在性能上,也优于JDK方式。

尽管如此,为什么您仍将 JDK 用于实现接口的目标?使所有目标CGLIB似乎更有优势。

正在将我的评论转化为答案...

用户 R.G 说:

This SO Q&A provides a lot of insights on the topic.

接受的答案不是很有帮助,但 Rafael 在他自己的 answer 下的评论对此进行了解释:“Cglib 是一个外部依赖项 (...) 依赖第三方软件是总是一场赌博,所以最好是尽可能少的人依赖它。” 也就是说,如果你有一个 Spring 设计非常简洁的应用程序,总是针对接口而不是直接针对 类,你根本不需要CGLIB。

稍微偏离主题,但仅供参考:出于类似的原因,Spock 测试框架支持 JDK 开箱即用的接口代理,供只需要接口模拟的用户使用。在那种情况下,可选的依赖项 CGLIB(或 ByteBuddy)和像 Objenesis 这样的特殊东西是不必要的。所以,这种策略很常见。