2011-12-27 275 views
1

方法setWrappedInstance in org.springframework.beans.BeanWrapper in 2.5.6 and was removed in 3.0.0。由於我正在將我的項目從2.5遷移到3.0,因此我收到了錯誤。我調查和實施類org.springframework.beans.BeanWrapperImpl仍然有執行方法setWrappedInstance從春季2.5遷移到春季3.0.5

下面是我的項目中引起麻煩的一段代碼。

public FieldComparator(String fieldName, Class clazz) { 
    _fieldName = fieldName; 
    _bw = new BeanWrapperImpl(clazz); 
}  

public int compare(Object o1, Object o2) { 
    if (o1 == null && o2 == null) return 0; 
    else if (o1 == null) return -1; 
    else if (o2 == null) return 1; 
    // otherwise 
    _bw.setWrappedInstance(o1); 
    Comparable v1 = (Comparable) _bw.getPropertyValue(_fieldName); 

    _bw.setWrappedInstance(o2); 
    Comparable v2 = (Comparable) _bw.getPropertyValue(_fieldName); 
    return NullsLowComparator.INSTANCE.compare(v1, v2); 
} 

所以會是確定的,如果我只是取代_bw實現與BeanWrapperImpl。我處於學習階段,我相信春天強烈建議使用接口而不是實現類本身。

這是對標準做法的改變還是我可以繼續進行簡單的改變?

回答

4

BeanWrapper.setWrappedInstance方法在Spring 2.5中被標記爲不推薦使用,並且在3.0中被完全移除。與JRE中的棄用(永遠不會被刪除)不同,Spring中不推薦使用的API會被刪除,所以建議您避免使用它們。

2.5.6 JavadocsetWrappedInstance說:

已過時。例如Spring 2.5的,有利於再造一個BeanWrapper每個目標實例

換句話說,而不是重用的BeanWrapper情況下,你應該根據需要創建新的BeanWrapperImpl實例。沒有性能損失 - BeanWrapperImpljavadoc表示它「緩存自檢效率」。

所以替換此:

_bw.setWrappedInstance(o1); 
Comparable v1 = (Comparable) _bw.getPropertyValue(_fieldName); 

與此:

Comparable v1 = (Comparable) new BeanWrapperImpl(o1).getPropertyValue(_fieldName); 

,並擺脫_bw場乾脆。

我相信春天強烈建議使用接口而不是實現類本身

根據經驗,一般情況下,是的。但是,嘗試應用一些實用性。您對BeanWrapperImpl的使用完全限於比較器的內部實現細節,因此直接使用它沒有實際的危害。如果您的比較器在公開方法簽名中公開了BeanWrapper,出於某種原因,那麼最好使用接口而不是實現完成。

+0

+1爲好解釋。不過,我贊成使用javadoc建議的PropertyAccessorFactory。如果它提到它,你的答案將是完美的。如果你編輯它,我會刪除我的。 – 2011-12-28 10:45:43

1

鑑於它是實例化bean包裝的代碼,並且它使用new BeanWrapperImpl()進行實例化,所以如果該字段的類型爲BeanWrapperImpl而不是BeanWrapper,我不會看到它會失敗。

然而,the javadoc狀態:

注:由於春季2。5,這是 - 幾乎所有目的 - 一個 內部類。它只是公開的,以允許從其他框架包訪問 。對於標準應用程序訪問目的, 改爲使用工廠方法的 PropertyAccessorFactory.forBeanPropertyAccess(java.lang.Object) 。

因此,我會使用javadoc建議使用的東西。