Spring 中的BeanUtils與apache中的BeanUtils用法與比較-(拷貝對象)

前言

BeanUtil是一個常用的在對象之間複製數據的工具類,著名的web開發框架struts就是依賴於它進行ActionForm的創建。
其中一個是apache包下的 一個是spring包下的

由來

有一次開發過程中,剛好看到小夥伴在調用 set 方法,將數據庫中查詢出來的 Po 對象的屬性拷貝到 Vo 對象中,
這種操作非常容易出錯,因爲對象的屬性太多,有可能會漏掉一兩個,而且肉眼很難察覺。
類似這樣的操作,我們很容易想到可以通過反射來解決。其實,如此普遍通用的功能,一個BeanUtils工具類就可以搞定了。
於是我建議這位小夥伴瞭解一下 BeanUtils,後來他使用了 Apache BeanUtils.copyProperties 進行屬性拷貝,
這爲程序挖了一個坑!
阿里代碼規約
當我們開啓阿里代碼掃描插件時,如果你使用了 Apache BeanUtils.copyProperties 進行屬性拷貝,
它會給你一個非常嚴重的警告。因爲,Apache BeanUtils性能較差,可以使用 Spring BeanUtils 
或者 Cglib BeanCopier 來代替。

spring包下

  1.public void copyProperties(java.lang.Object dest, java.lang.Object orig)
	把dest中的值copy到orig中.

apache包下

包:

org.apache.commons.beanutils.BeanUtils
apache下的BeanUtils最常用的方法爲:
  1.public void copyProperties(java.lang.Object dest, java.lang.Object orig)
	把orig中的值copy到dest中.
2.   public Map describe(java.lang.Object bean)
	把Bean的屬性值放入到一個Map裏面
   3.
   public void populate(java.lang.Object bean, java.util.Map properties)
	把properties裏面的值放入bean中
4.   public void setProperty(java.lang.Object bean, java.lang.String name, java.lang.Object value)
	設置Bean對象的名稱爲name的property的值爲value.
 public String getProperty(java.lang.Object bean, java.lang.String name)
  取得bean對象中名爲name的屬性的值。

詳細的使用方法可以參見官方網站:

http://jakarta.apache.org/commons/beanutils/

Apache Common BeanUtil的常見使用場景。

  1. 同類之間不同對象要求進行數據複製。
    
User user1 =;
User user2 =;
BeanUtils. copyProperties(user2,user1);
  1. 不同類不同對象之間的數據複製。
    
UserForm userForm =;
User user =;
BeanUtils. copyProperties(user, userForm);
相信經常使用struts的人,一定會很熟悉上面的代碼。
這是一個典型把頁面的value object數據複製到domain object的例子。
  1. 對象數據和Map之間互相轉化。
    
User user =;
Map userMap = BeanUtils.describe(user);
Map userMap =;
User user =;
BeanUtils.populate(user,userMap);
 Map可以看成一個動態數據容器,作爲VO很適合在不同層之間傳播數據,作爲PO也可以動態存儲字段信息,
合理運用可以減少程序很多修改和維護工作。所以讓bean和map之間方便的進行數據填充,非常必要。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章