2011-12-27 265 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建议使用的东西。