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,因此确实会删除它们,因此,建议您避免使用它们。setWrappedInstance
的2.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
,那么最好使用接口而不是实现来完成。