詳解Spring中BeanUtils工具類的使用
簡介
說明
本文介紹Spring的BeanUtils工具類的用法。
我們經常需要將不同的兩個對象實例進行屬性復制,比如將DO對象進行屬性復制到DTO,這種轉換最原始的方式就是手動編寫大量的 get/set代碼,很繁瑣。為瞭解決這一痛點,就誕生瞭一些方便的類庫,常用的有 Apache的 BeanUtils,Spring的 BeanUtils, Dozer,Orika等拷貝工具。
由於Apache的BeanUtils的性能很差,強烈不建議使用。阿裡巴巴Java開發規約插件上也明確指出:
“Ali-Check | 避免用Apache Beanutils進行屬性的copy。”
Spring的BeanUtils方法
方法 | 說明 |
---|---|
BeanUtils.copyProperties(source, target); | source對應的對象成員賦值給target對應的對象成員 |
BeanUtils.copyProperties(source, target, "id", "time"); | 忽略拷貝某些字段。本處是忽略:id與time |
Spring的BeanUtils方法註意事項
泛型隻在編譯期起作用,不能依靠泛型來做運行期的限制;
淺拷貝和深拷貝
淺拷貝:對基本數據類型進行值傳遞,對引用數據類型進行引用傳遞般的拷貝,此為淺拷貝
深拷貝:對基本數據類型進行值傳遞,對引用數據類型,創建一個新的對象,並復制其內容,此為深拷貝。
Spring的BeanUtils與Apache的BeanUtils區別
項 | Spring的BeanUtils | Apache的BeanUtils |
---|---|---|
性能 | 好 原因:對兩個對象中相同名字的屬性進行簡單的get/set,僅檢查屬性的可訪問性 |
差 原因:有很多檢驗:類型的轉換、對象所屬類的可訪問性等 註意:本處類型轉換是類似的類,多個String轉為List<String>是不行的。 |
使用方面 | 第一個參數是源,第二個參數是目標。 無需捕獲異常 |
第一個參數是目標,第二個參數是源。 必須捕獲異常 |
深/淺拷貝 | 淺拷貝 | 淺拷貝 |
Apache的BeanUtils方法。(依賴:maven裡直接搜“commons-beanutils”)
方法 | 說明 |
---|---|
BeanUtils.copyProperties(Object target, Object source); | source對應的對象成員賦值給target對應的對象成員 |
BeanUtils.copyProperties(Object target, String name, Object source); | 隻拷貝某些字段 |
Apache的BeanUtils支持的類型轉換
- java.lang.BigDecimal
- java.lang.BigInteger
- boolean and java.lang.Boolean
- byte and java.lang.Byte
- char and java.lang.Character
- java.lang.Class
- double and java.lang.Double
- float and java.lang.Float
- int and java.lang.Integer
- long and java.lang.Long
- short and java.lang.Short
- java.lang.String
- java.sql.Date
- java.sql.Time
- java.sql.Timestamp
java.util.Date是不被支持的,而它的子類java.sql.Date是被支持的。因此如果對象包含時間類型的屬性,且希望被轉換的時候,一定要使用java.sql.Date類型。否則在轉換時會提示argument mistype異常。
實例
entity
package com.example.entity; import lombok.Data; @Data public class Question { private Integer id; private Integer studentId; private String content; private Integer value; }
package com.example.entity; import lombok.Data; @Data public class Student { private Integer id; private String name; private Integer points; }
vo
package com.example.vo; import lombok.Data; import java.io.Serializable; import java.util.List; @Data public class QuestionStudentVO implements Serializable { private Integer id; private String content; private Integer value; private Integer studentId; private List<String> name; private Integer points; }
測試類
package com.example; import com.example.entity.Question; import com.example.entity.Student; import com.example.vo.QuestionStudentVO; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.BeanUtils; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class DemoApplicationTests { @Test public void beanUtilTest(){ Question question = new Question(); question.setId(2); // question.setStudentId(3); question.setContent("This is content"); question.setValue(100); Student student = new Student(); student.setId(3); student.setName("Tony Stark"); student.setPoints(201); QuestionStudentVO questionStudentVO = new QuestionStudentVO(); BeanUtils.copyProperties(question, questionStudentVO); BeanUtils.copyProperties(student, questionStudentVO); System.out.println(questionStudentVO); } }
執行結果
QuestionStudentVO(id=3, content=This is content, value=100, studentId=null, name=null, points=201)
到此這篇關於詳解Spring中BeanUtils工具類的使用的文章就介紹到這瞭,更多相關Spring BeanUtils工具類內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 基於Spring BeanUtils的copyProperties方法使用及註意事項
- Java詳解entity轉換到vo過程
- java開發BeanUtils類解決實體對象間賦值
- BeanUtils.copyProperties()拷貝id屬性失敗的原因及解決
- BeanUtils.copyProperties擴展–實現String轉Date