1. 程式人生 > >Spring和Apache包下的物件拷貝工具BeanUtils.copyProperties()

Spring和Apache包下的物件拷貝工具BeanUtils.copyProperties()

一.背景

今天在使用BeanUtils.copyProperties()進行物件拷貝的時候遇到了一個坑。因為業務需求,要拷貝一個物件,為了不影響的原有物件的屬性,自然不能直接賦值,用set方法又太笨重了,淺克隆和深克隆需要繼承介面重寫clone()方法,別人的物件,怕改了影響別人。。。於是想到了BeanUtils.copyProperties(),簡潔方便。

二.遇坑

一個小坑。。。

Spring包下的org.springframework.beans.BeanUtils.copyProperties();

	public static void copyProperties(Object source, Object target) throws BeansException {
		copyProperties(source, target, null, (String[]) null);
	}

Apeche包下的org.apache.commons.beanutils.BeanUtils.copyProperties();

    public static void copyProperties(Object dest, Object orig)
        throws IllegalAccessException, InvocationTargetException {
        
        BeanUtilsBean.getInstance().copyProperties(dest, orig);
    }

通過原始碼可以發現,Spring包下的原類在前,目標類在後;而Apeche包下的恰恰相反。

之前用過的Apeche的,這次用Spring的用Apeche的語法寫的,結果可想而知。。

三.總結

1.看了下原始碼和網上討論,Spring的BeanUtils.copyProperties()會忽略null的屬性,只拷貝有值的屬性,相比Apache包下的不容易出現一些錯誤。

2.無論Spring的還是Apache的,cglib包下也有一個物件拷貝工具,Spring和Apache是使用反射機制實現的,cglib是使用動態代理實現的。它們都會犧牲一定的效率。

3.對於只有幾個屬性的物件,直接使用set,get方法就好,屬性多的話儘量使用Spring下的吧。

4.使用工具類在程式碼簡潔等地方上來說是很好的,但是使用之前,無論需求再多、工作程式碼量再多,都要仔細看看原始碼實現,避免這些坑。(反思。。)

5.以後自己提煉一下工具類!