2017-01-05 110 views
6

Spring不包含cglib依賴項,cglib和spring cglib都有Enhancer類,一個是net.sf.cglib.proxy.Enhancer,而另一個是org.springframework.cglib.proxy,它們之間有什麼區別?Spring CGLIB和CGLIB有什麼區別?

回答

3

這就是所謂的重新包裝:而不是使用一些庫作爲依賴,一個項目使得依賴的副本,它在地方他們自己的項目的一部分,一個不同的包。

這樣做的原因是,使用Spring的項目可能想要使用cglib本身。如果Spring有特定版本的cglib作爲依賴項,那麼使用Spring選擇不同版本的項目是不可能的。但是,如果Spring使用不同包中的重新包裝的cglib,則不存在版本衝突,並且項目可以使用任何版本的cglib(如果他們喜歡)。

有些項目以類似的方式重新包裝Guava,Netty或其他流行的圖書館。

2

彈簧與重新包裝的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" 
2

,因爲它是在release notes of this version提到CGLIB被聯到春季爲3.2.0版本:

在以前的版本中,通過代理目標類Spring基於子類的AOP代理(如 的用戶=「true」)和@Configuration類支持是 需要聲明CGLIB 2.2的顯式依賴。自Spring Framework 3.2起,我們現在重新打包並內聯最新發布的CGLIB 3.0。

這意味着對於創建包含invokedynamic字節碼指令的 類型的子類代理的Java 7用戶而言,用戶的更大便利性以及正確的 功能。重新包裝 CGLIB內部確保與其他第三方 可能依賴於其他版本的CGLIB的框架沒有類路徑衝突。

這樣做是爲了提供與cglib相關聯的自動更新並避免版本衝突,因爲cglib somestimes會破壞其API。