Java 从Spring2.5迁移到Spring3.0.5

Java 从Spring2.5迁移到Spring3.0.5,java,spring,migration,Java,Spring,Migration,在2.5.6版的org.springframework.beans.BeanWrapper中有方法setWrappedInstance,并在3.0.0版中删除。由于我正在将我的项目从2.5迁移到3.0的过程中,我遇到了一些错误。我进行了调查,实现类org.springframework.beans.BeanWrapperImpl仍然实现了方法setWrappedInstance 下面是我的项目中引起麻烦的一段代码 public FieldComparator(String fieldName,

在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);
}
那么,如果我用
BeanWrapperImpl
替换
\ubw
实现,这样可以吗。我正处于学习阶段,我相信spring强烈建议使用接口而不是实现类本身


这是对标准实践的更改还是我可以继续进行简单的更改?

BeanRapper.setWrappedInstance方法在Spring 2.5中被标记为不推荐,并在3.0中被完全删除。与JRE中的不推荐(从不删除)不同,Spring中不推荐的API确实会被删除,因此建议您避免使用它们

for
setWrappedInstance
说明:

不赞成。从Spring 2.5开始,支持为每个目标实例重新创建
BeanRapper

换句话说,您应该根据需要创建新的
BeanWrapper
实例,而不是重用
BeanWrapper
实例。这没有性能上的损失,
BeanWrapperImpl
说它“缓存内省结果以提高效率。”

因此,请将其替换为:

_bw.setWrappedInstance(o1);
Comparable v1 = (Comparable) _bw.getPropertyValue(_fieldName);
为此:

Comparable v1 = (Comparable) new BeanWrapperImpl(o1).getPropertyValue(_fieldName);
然后完全去掉
\u bw
字段

我相信spring强烈建议使用接口而不是实现类本身


一般来说,是的。但是,尝试将一些实用性应用于此。您对BeanWrapperImpl的使用完全局限于比较器的内部实现细节,因此直接使用它并没有真正的危害。如果您的比较器出于某种原因要在公共方法签名中公开
BeanRapper
,那么最好使用接口而不是实现。

BeanRapper.setWrappedInstance方法在Spring 2.5中被标记为不推荐使用,并在3.0中被完全删除。与JRE中的不推荐(从不删除)不同,Spring中不推荐的API确实会被删除,因此建议您避免使用它们

for
setWrappedInstance
说明:

不赞成。从Spring 2.5开始,支持为每个目标实例重新创建
BeanRapper

换句话说,您应该根据需要创建新的
BeanWrapper
实例,而不是重用
BeanWrapper
实例。这没有性能上的损失,
BeanWrapperImpl
说它“缓存内省结果以提高效率。”

因此,请将其替换为:

_bw.setWrappedInstance(o1);
Comparable v1 = (Comparable) _bw.getPropertyValue(_fieldName);
为此:

Comparable v1 = (Comparable) new BeanWrapperImpl(o1).getPropertyValue(_fieldName);
然后完全去掉
\u bw
字段

我相信spring强烈建议使用接口而不是实现类本身


一般来说,是的。但是,尝试将一些实用性应用于此。您对BeanWrapperImpl的使用完全局限于比较器的内部实现细节,因此直接使用它并没有真正的危害。如果您的比较器出于某种原因要在公共方法签名中公开
BeanRapper
,那么最好使用接口而不是实现来实现。

假设是您的代码实例化了bean包装器,并且它是使用
新的BeanRapperImpl()
实例化的,如果字段的类型是
BeanWrapperImpl
而不是
beanwraper
,我看不出它怎么会失败

然而,缔约国:

注意:从Spring 2.5开始,这几乎是一个 内部类。它是公开的,以便允许从 其他框架包。出于标准应用程序访问目的, 使用 PropertyAccessorFactory.forBeanPropertyAccess(java.lang.Object) 工厂方法代替


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

考虑到是您的代码实例化了bean包装器,并且它是使用
new BeanWrapperImpl()
实例化的,我不认为如果字段的类型是
BeanWrapperImpl
而不是
beanwraper
,它会失败

然而,缔约国:

注意:从Spring 2.5开始,这几乎是一个 内部类。它是公开的,以便允许从 其他框架包。出于标准应用程序访问目的, 使用 PropertyAccessorFactory.forBeanPropertyAccess(java.lang.Object) 工厂方法代替


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

好的解释是+1。不过,我倾向于使用javadoc建议的PropertyAccessorFactory。如果你的回答提到了,那就太完美了。如果你编辑它,我会删除我的。为了更好的解释+1。不过,我倾向于使用javadoc建议的PropertyAccessorFactory。如果你的回答提到了,那就太完美了。如果你编辑它,我会删除我的。