繁体   English   中英

从Spring 2.5迁移到Spring 3.0.5

[英]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,因此确实会删除它们,因此,建议您避免使用它们。

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 ,那么最好使用接口而不是实现来完成。

既然是实例化bean包装器的代码,并且是使用new BeanWrapperImpl()实例化的,那么我不明白如果字段的类型为BeanWrapperImpl而不是BeanWrapper它将如何失败。

但是, javadoc指出:

注意:从Spring 2.5开始,几乎所有目的都是内部类。 它只是公开的,以允许从其他框架包进行访问。 为了实现标准应用程序访问,请改用PropertyAccessorFactory.forBeanPropertyAccess(java.lang.Object)工厂方法。

因此,我将使用javadoc建议使用的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM