Spring CGLIB和CGLIB之间的区别是什么?

时间:2017-01-05 06:08:53

标签: java spring aop cglib

Spring没有包含cglib依赖项,cglib和spring cglib都有net.sf.cglib.proxy.Enhancer类,一个是org.springframework.cglib.proxy而另一个是 <a href="path://text?Text to share">Share to path</a> ,是什么?他们之间的区别?

4 个答案:

答案 0 :(得分:3)

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

这样做的原因是使用Spring的项目可能想要使用cglib本身。如果Spring将特定版本的cglib作为依赖项,那么使用Spring的项目就不可能选择不同的版本。但是如果Spring使用不同包中的重新打包的cglib,则没有版本冲突,如果他们喜欢,项目可以使用任何版本的cglib。

有些项目以类似的方式重新打包Guava,Netty或其他流行的图书馆。

答案 1 :(得分:3)

Cglib在版本3.2.0中被内联到Spring中,正如release notes of this version中提到的那样:

  

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

     

这意味着用户更方便,也更正确   正在创建子类代理的Java 7用户的功能   包含invokedynamic字节码指令的类型。重新包装   CGLIB内部确保没有类路径与其他第三方冲突   框架可能依赖于其他版本的CGLIB。

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

答案 2 :(得分: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"

答案 3 :(得分:0)

没什么区别,只是重新包装


ps。 class ObjenesisCglibAopProxy extends CglibAopProxy

  

Objenesis aims to overcome these restrictions by bypassing the constructor on object instantiation.