栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MapStruct 对象间属性复制

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MapStruct 对象间属性复制

在JAVA项目开发过程中,经常会设计到对象间属性值拷贝,这种场景有多个框架或者技术可以实现,比如Spring和Apache给我们提供了BeatUtils工具,但是他的实现机制是通过反射,拷贝属性个人觉得花费时间较长,性能相对低(特别是要求高性能的场景)。
这里我们介绍一个新的框架MapStruct来简单实现。

代码demo
  • pom 引入

        8
        8
        1.3.1.Final
    

    
        
            org.mapstruct
            mapstruct
            ${mapstruct.version}
        
        
            org.mapstruct
            mapstruct-jdk8
            ${mapstruct.version}
        
        
            org.mapstruct
            mapstruct-processor
            ${mapstruct.version}
        
    
  • 新建两个pojo
package com.xx.mapstruct;

import lombok.Data;

@Data
public class Src {
    private String name;
}

package com.xx.mapstruct;

import lombok.Data;

@Data
public class Target {
    private String name;
}

  • 新建一个转换接口 DemoMap,里面代码大致如下:
package com.xx.mapstruct;

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper
public interface DemoMap {

// @A
    DemoMap CAR_MAP = Mappers.getMapper(DemoMap.class);
    
// @B
    Target tar(Src src);
}

@A: 通过Mappers来创建一个DemoMap的实例A,该实例主要用处在于供外部代码提供属性复制的功能;

@B:我们看接口里定义了一个tar方法,我们根据自己的需求定义入参和出参数,外部代码获得实例A后可以调用该方法进行对象间属性复制

  • 测试类
package com.xx;

import com.xx.mapstruct.DemoMap;
import com.xx.mapstruct.Src;
import com.xx.mapstruct.Target;
import org.junit.Test;

public class MapStructTest {

    @Test
    public void test01() {
        Src src = new Src();
        src.setName("ppp");

        Target tar = DemoMap.CAR_MAP.tar(src);
        System.out.println(tar.getName());
    }
}

  • 测试结果
指定源属性与目标属性

上面只是一个简单的属性复制demo,默认在两个属性名称一样的两个属性间复制;如果两个对象间的属性名称不一致,则需要手动指定;

  • 新建一个pojo
package com.xx.mapstruct;

import lombok.Data;

@Data
public class Target2 {
    private String name2;
}

  • 新增转换方法,这里主要用 @Mapping 注解进行属性映射定义
package com.xx.mapstruct;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface DemoMap {

    DemoMap CAR_MAP = Mappers.getMapper(DemoMap.class);

    Target tar(Src src);

// @A
    @Mapping(source = "name", target = "name2")
    Target2 tar2(Src src);
}

@A:指定属性转换关系

  • 测试类
    @Test
    public void test02() {
        Src src = new Src();
        src.setName("ppp02");

        Target2 tar = DemoMap.CAR_MAP.tar2(src);
        System.out.println(tar.getName2());
    }
  • 测试结果
实现原理

其主要原理是 JAVA AbstractProcessor javac代码编译期处理,自动生成方法对于的代码;JAVA AbstractProcessor自定义开发可以参考我的:JAVA AbstractProcessor javac代码编译期SPI接口

代码上传到 【gitee】 可下载查看
over~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/657758.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号