詳解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支持的類型轉換

  1. java.lang.BigDecimal
  2. java.lang.BigInteger
  3. boolean and java.lang.Boolean
  4. byte and java.lang.Byte
  5. char and java.lang.Character
  6. java.lang.Class
  7. double and java.lang.Double
  8. float and java.lang.Float
  9. int and java.lang.Integer
  10. long and java.lang.Long
  11. short and java.lang.Short
  12. java.lang.String
  13. java.sql.Date
  14. java.sql.Time
  15. 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!

推薦閱讀: