Spring CGLIB 和 CGLIB 有什么区别?

问题描述 投票:0回答:5

Spring不包含cglib依赖,cglib和spring cglib都有

Enhancer
类,一个是
net.sf.cglib.proxy.Enhancer
,另一个是
org.springframework.cglib.proxy
,他们有什么区别?

java spring aop cglib
5个回答
5
投票

这称为重新打包:项目不使用某些库作为依赖项,而是将依赖项的副本作为其自己项目的一部分并将其放置在不同的包中。

这样做的原因是使用 Spring 的项目可能想要使用 cglib 本身。如果 Spring 有特定版本的 cglib 作为依赖项,则使用 Spring 的项目不可能选择不同的版本。但是如果 Spring 使用重新打包的 cglib,并且位于不同的包中,则不存在版本冲突,并且项目可以根据需要使用任何版本的 cglib。

一些项目以类似的方式重新打包 Guava、Netty 或其他流行的库。


3
投票

Cglib 从版本 3.2.0 开始内联到 Spring 中,正如该版本的 发行说明中提到的那样 :

在之前的版本中,Spring 基于子类的 AOP 代理的用户(例如 通过 proxy-target-class="true") 和 @Configuration 类支持 需要声明对 CGLIB 2.2 的显式依赖。截至春季 Framework 3.2,我们现在重新打包并内联新发布的CGLIB 3.0.

这意味着为用户带来更大的便利,以及正确的 为 Java 7 用户创建子类代理的功能 包含 invokedynamic 字节码指令的类型。重新包装 CGLIB 内部确保不会与其他第三方发生类路径冲突 可能依赖于其他版本的 CGLIB 的框架。

这样做是为了提供与 cglib 相关的自动更新,并避免版本冲突,因为 cglib 有时会破坏其 API。


2
投票

Spring 附带重新打包的 cglib。您可以在 Gradle buildfile 中查看实际的 cglib 版本。搜索单词“cglib”,你会找到它:

// As of Spring 4.0.3, spring-core includes asm 5.x and repackages cglib 3.2, inlining
// both into the spring-core jar. cglib 3.2 itself depends on asm 5.x and is therefore
// further transformed by the JarJar task to depend on org.springframework.asm; this
// avoids including two different copies of asm unnecessarily.
def cglibVersion = "3.2.4"

0
投票

没有区别,只是重新包装


ps。

class ObjenesisCglibAopProxy extends CglibAopProxy

Objenesis 旨在通过绕过对象实例化的构造函数来克服这些限制。


0
投票

有没有办法下载重新封装的cglib?

© www.soinside.com 2019 - 2024. All rights reserved.