Java 从Spring2.5迁移到Spring3.0.5
在2.5.6版的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,
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确实会被删除,因此建议您避免使用它们
forsetWrappedInstance
说明:
不赞成。从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。如果你的回答提到了,那就太完美了。如果你编辑它,我会删除我的。