最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring的BeanUtils.copyProperties屬性復(fù)制避坑指南

 更新時間:2024年08月12日 17:01:19   作者:黃雞黃雞  
這篇文章主要介紹了Spring的BeanUtils.copyProperties屬性復(fù)制避坑指南,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Spring的BeanUtils.copyProperties屬性復(fù)制避坑

項目場景:

在分布式項目中,我進行我們的項目對外接口整合時,需要自己再定義對外的類來傳參,就避免不了用BeanUtils.copyProperties工具來進行屬性賦值。

問題描述

關(guān)于BeanUtils.copyProperties的屬性復(fù)制規(guī)則

話不多說直接上demo代碼

  • 類A
class A {
    int a;
    List<Integer> list = new ArrayList<>();
    List<B> bList = new ArrayList<>();
    B b;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }

    public List<Integer> getList() {
        return list;
    }

    public void setList(List<Integer> list) {
        this.list = list;
    }

    public List<B> getbList() {
        return bList;
    }

    public void setbList(List<B> bList) {
        this.bList = bList;
    }

   @Override
   public String toString() {
       return "A{" +
           "a=" + a +
           ", list=" + list +
           ", bList=" + bList +
           ", b=" + b +
           '}';
   }
}
  • 類A1
class A1 {
    int a;
    List<Integer> list = new ArrayList<>();
    List<B> bList = new ArrayList<>();
    B b;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }

    public List<Integer> getList() {
        return list;
    }

    public void setList(List<Integer> list) {
        this.list = list;
    }

    public List<B> getbList() {
        return bList;
    }

    public void setbList(List<B> bList) {
        this.bList = bList;
    }

    @Override
    public String toString() {
        return "A1{" +
            "a=" + a +
            ", list=" + list +
            ", bList=" + bList +
            ", b=" + b +
            '}';
    }
}
  • 類B
class B {
	String b;

    public String getB() {
      return b;
    }

	public void setB(String b) {
	  this.b = b;
	}

	@Override
	public String toString() {
	    return "B{" +
	        "b='" + b + '\'' +
	        '}';
	}
	
	public B() {
    }

    public B(String b) {
        this.b = b;
    }
}

測試main方法1

public static void main(String[] args) {
    A a = new A();

    B b = new B();
    b.setB("bbb");

    List<Integer> list = new ArrayList<>();
    list.add(100);
    list.add(200);

    List<B> bList = new ArrayList<>();
    bList.add(new B("dd"));
    bList.add(new B("cc"));
    bList.add(new B("ee"));

    a.setA(1);
    a.setB(b);
    a.setList(list);
    a.setbList(bList);

    A1 a1 = new A1();

    BeanUtils.copyProperties(a, a1);

    System.out.println(a1);
}

結(jié)果::A1{a=1, list=[100, 200], bList=[B{b=‘dd’}, B{b=‘cc’}, B{b=‘ee’}], b=B{b=‘bbb’}}

測試main方法2

public static void main(String[] args) {
   A a = new A();

    B b = new B();
    b.setB("bbb");

    List<Integer> list = new ArrayList<>();
    list.add(100);
    list.add(200);

    List<B> bList = new ArrayList<>();
    bList.add(new B("dd"));
    bList.add(new B("cc"));
    bList.add(new B("ee"));

    a.setA(1);
    a.setB(b);
    a.setList(list);
    a.setbList(bList);

    A1 a1 = new A1();

    BeanUtils.copyProperties(a, a1);

    b.setB("aaa");

    a.setA(2);

    list.clear();
    list.add(666);
    list.add(777);

    bList.clear();
    bList.add(new B("abc"));

    System.out.println(a1);
}

結(jié)果:A1{a=1, list=[666, 777], bList=[B{b=‘abc’}], b=B{b=‘aaa’}}

結(jié)果分析

從以上的例子和結(jié)果來看,BeanUtils.copyProperties是淺拷貝。

  • main方法1: 當(dāng)A和A1中的屬性名稱相同時,使用BeanUtils.copyProperties會將所有屬性進行復(fù)制。從結(jié)果上來看,不管是基本數(shù)據(jù)類型int a,還是剩余的三個引用數(shù)據(jù)類型,List<Integer> listList<B> bList、B b,都進行了復(fù)制。
  • main方法2 :第二個main方法在第一個的基礎(chǔ)上對要復(fù)制的A的屬性進行了修改,從結(jié)果上發(fā)現(xiàn),A1的屬性中基本數(shù)據(jù)類型int a的值并沒有因為修改而改變,但引用數(shù)據(jù)類型List<Integer> list、List<B> bListB b的值會因為改變了A的屬性而改變。

附帶兩種對象屬性復(fù)制的方法

// 淺拷貝
a1 = JSONObject.parseObject(JSONObject.toJSONString(a), A1.class)

// 深拷貝,其中SerializerFeature.DisableCircularReferenceDetect是為了解決JSON的$ref 引用
a1 = JSONObject.parseObject(JSONObject.toJSONString(a, SerializerFeature.DisableCircularReferenceDetect), A1.class);

// 深拷貝
ObjectMapper objectMapper = new ObjectMapper();
a1 = objectMapper.readValue(JSONObject.toJSONString(a, SerializerFeature.DisableCircularReferenceDetect), A1.class);

結(jié)論

BeanUtils.copyProperties的拷貝是淺拷貝,對基本數(shù)據(jù)類型進行值傳遞的屬性復(fù)制,改變原基本數(shù)據(jù)類型的值不會改變被復(fù)制的屬性結(jié)果;

對引用數(shù)據(jù)類型進行引用傳遞的屬性復(fù)制,只是復(fù)制了一個內(nèi)存地址過去,指向的還是同一個對象,并沒有新建對象,改變原對象的值,被復(fù)制的屬性的值也會隨著變化。

相關(guān)文章

  • jdk8?FunctionalInterface注解源碼解讀

    jdk8?FunctionalInterface注解源碼解讀

    這篇文章主要介紹了jdk8?FunctionalInterface注解源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • SpringFramework應(yīng)用接入Apollo配置中心過程解析

    SpringFramework應(yīng)用接入Apollo配置中心過程解析

    這篇文章主要介紹了SpringFramework應(yīng)用接入Apollo配置中心過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 使用springboot整合RateLimiter限流過程

    使用springboot整合RateLimiter限流過程

    這篇文章主要介紹了使用springboot整合RateLimiter限流過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java file.renameTo返回false的原因及解決方案

    java file.renameTo返回false的原因及解決方案

    這篇文章主要介紹了java file.renameTo返回false的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java刪除文件、目錄及目錄下所有文件的方法實例

    Java刪除文件、目錄及目錄下所有文件的方法實例

    這篇文章主要給大家介紹了關(guān)于利用Java刪除文件、目錄及目錄下所有文件的方法,文中給出了詳細(xì)的示例代碼與注解,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • 如何在Java中使用WebSocket協(xié)議

    如何在Java中使用WebSocket協(xié)議

    WebSocket是一種基于 TCP 協(xié)議的全雙工通信協(xié)議,可以在瀏覽器和服務(wù)器之間建立實時、雙向的數(shù)據(jù)通信,下面這篇文章主要給大家介紹了關(guān)于如何在Java中使用WebSocket協(xié)議的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • java如何在項目中實現(xiàn)excel導(dǎo)入導(dǎo)出功能

    java如何在項目中實現(xiàn)excel導(dǎo)入導(dǎo)出功能

    這篇文章主要介紹了java如何在項目中實現(xiàn)excel導(dǎo)入導(dǎo)出功能的相關(guān)資料,EasyExcel是一個基于Apache?POI開發(fā)的開源Java庫,用于簡化Excel文件的讀寫操作,文中將用法介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • SpringBoot中的@Conditional?注解的使用

    SpringBoot中的@Conditional?注解的使用

    @Conditional是Spring4新提供的注解,它的作用是按照一定的條件進行判斷,滿足條件的才給容器注冊Bean,本文主要介紹了SpringBoot中的@Conditional?注解的使用
    2024-01-01
  • SpringBoot如何根據(jù)用戶系統(tǒng)時區(qū)動態(tài)展示時間

    SpringBoot如何根據(jù)用戶系統(tǒng)時區(qū)動態(tài)展示時間

    這篇文章主要介紹了SpringBoot如何根據(jù)用戶系統(tǒng)時區(qū)動態(tài)展示時間,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 23種設(shè)計模式(19)java責(zé)任鏈模式

    23種設(shè)計模式(19)java責(zé)任鏈模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計模式之java責(zé)任鏈模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論

确山县| 雅安市| 聊城市| 英德市| 连山| 永胜县| 青阳县| 临夏市| 大方县| 伊春市| 全椒县| 辰溪县| 盈江县| 镶黄旗| 修文县| 札达县| 宣汉县| 额敏县| 吐鲁番市| 左权县| 兰溪市| 嘉善县| 封丘县| 南汇区| 翼城县| 屏东市| 中超| 台中县| 定边县| 凉城县| 岑巩县| 吉首市| 佳木斯市| 道孚县| 浮山县| 刚察县| 铅山县| 健康| 高碑店市| 阿拉尔市| 华池县|