从Spring 2.5迁移到Spring 3.0.5

时间:2011-12-27 19:55:16

标签: java spring migration

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强烈建议使用接口而不是实现类本身。

这是针对标准做法的改变还是我可以继续进行简单的改变?

2 个答案:

答案 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建议使用的内容。