为什么 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 这样的特殊东西是不必要的。所以,这种策略很常见。
我知道 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 这样的特殊东西是不必要的。所以,这种策略很常见。