首頁 > 軟體

詳解Spring中BeanUtils工具類的使用

2022-06-29 14:03:38

簡介

說明

本文介紹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的BeanUtilsApache的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工具類內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com