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强烈建议使用接口而不是实现类本身。
这是针对标准做法的改变还是我可以继续进行简单的改变?
答案 0 :(得分:4)
BeanWrapper.setWrappedInstance
方法在Spring 2.5中被标记为已弃用,并在3.0中完全删除。与JRE中的弃用(永远不会被删除)不同,Spring中不推荐使用的API会被删除,因此建议您避免使用它们。
setWrappedInstance
的{{3}}说:
已过时。从Spring 2.5开始,支持为每个目标实例重新创建
BeanWrapper
换句话说,您应该根据需要创建新的BeanWrapper
实例,而不是重用BeanWrapperImpl
的实例。对此没有任何性能损失 - BeanWrapperImpl
2.5.6 Javadoc表示“缓存效率的内省结果。”
所以替换这个:
_bw.setWrappedInstance(o1);
Comparable v1 = (Comparable) _bw.getPropertyValue(_fieldName);
用这个:
Comparable v1 = (Comparable) new BeanWrapperImpl(o1).getPropertyValue(_fieldName);
完全摆脱_bw
字段。
我认为spring强烈建议使用接口而不是实现类本身
作为一般经验法则,是的。但是,尝试对此应用一些实用性。您对BeanWrapperImpl
的使用完全受制于比较器的内部实现细节,因此直接使用它并没有真正的危害。如果您的比较器要在公共方法签名中公开BeanWrapper
,出于某种原因,那么最好使用接口而不是实现来完成。
答案 1 :(得分:1)
鉴于它是实例化bean包装器的代码,并且它是使用new BeanWrapperImpl()
实例化的,我不知道如果字段类型是如何失败的BeanWrapperImpl
而不是BeanWrapper
。
然而,the javadoc声明:
注意:从Spring 2.5开始,这是 - 几乎所有目的 - 一个 内部课堂。它只是公开的,以便允许访问 其他框架包。对于标准应用访问目的, 使用 PropertyAccessorFactory.forBeanPropertyAccess(java.lang.Object中) 而是工厂方法。
因此我会使用javadoc建议使用的内容。