2.5.6中的setWrappedInstance中有方法org.springframework.beans.BeanWrapper,而3.0.0中已将其删除。在我将项目从2.5迁移到3.0的过程中,出现错误。我进行了调查,实现类org.springframework.beans.BeanWrapperImpl仍然实现了方法setWrappedInstance

下面是我的项目中引起麻烦的代码。

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实现,那没关系。我正处于学习阶段,我相信spring强烈建议使用接口而不是实现类本身。

这是违反标准做法的变更,还是我可以继续进行简单的变更?

最佳答案

BeanWrapper.setWrappedInstance方法在Spring 2.5中被标记为已弃用,而在3.0中已被完全删除。与JRE中的弃用(永远不会删除)不同,Spring中确实弃用了API,因此确实会删除它们,因此,建议您避免使用它们。

setWrappedInstance2.5.6 Javadoc说:


  不推荐使用。从Spring 2.5开始,建议为每个目标实例重新创建BeanWrapper


换句话说,应该重用BeanWrapper实例,而不是重用BeanWrapperImpl实例。对此没有性能上的损失-BeanWrapperImpl javadoc说它“缓存自省结果以提高效率”。

因此,替换为:

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


有了这个:

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


并完全摆脱_bw字段。


  我认为spring强烈建议使用接口而不是实现类本身


一般而言,是的。但是,请尝试对此应用一些实用性。 BeanWrapperImpl的使用完全限于比较器的内部实现细节,因此直接使用它不会有任何实际危害。如果您的比较器出于某种原因要在公共方法签名中公开BeanWrapper,那么最好使用接口而不是实现来完成。

10-06 00:48