[英]migrating from Spring 2.5 to Spring 3.0.5
2.5.6中的org.springframework.beans.BeanWrapper
中有setWrappedInstance
方法,而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强烈建议使用接口而不是实现类本身。
这是违反标准做法的变更,还是我可以继续进行简单的变更?
在Spring 2.5中, BeanWrapper.setWrappedInstance
方法被标记为已弃用,而在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
,那么最好使用接口而不是实现来完成。
既然是实例化bean包装器的代码,并且是使用new BeanWrapperImpl()
实例化的,那么我不明白如果字段的类型为BeanWrapperImpl
而不是BeanWrapper
它将如何失败。
但是, javadoc指出:
注意:从Spring 2.5开始,几乎所有目的都是内部类。 它只是公开的,以允许从其他框架包进行访问。 为了实现标准应用程序访问,请改用PropertyAccessorFactory.forBeanPropertyAccess(java.lang.Object)工厂方法。
因此,我将使用javadoc建议使用的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.