Mapstruct为什么比BeanUtils快?简单使用示例。
一、Mapstruct是什么?
Mapstruct和BeanUtil功能一样,都是两个实体类之间属性复制工具。
之前在开发项目的时候都是用的BeanUtils,听说过Mapstruct的大名但是没有使用过。最近来看看这个Mapstruct怎么玩?为什么那么快?
二、Mapstruct是怎么使用?
2.1导入依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.3.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.3.Final</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
2.2使用
首先创建两个实体类Product,ProductV2
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Product {
private Integer id;
private String name;
private BigDecimal price;
private String pic;
private Date createTime;
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Product {
private Integer id;
private String name;
private BigDecimal price;
private String pic;
private Date createTime;
}
新建类型转换接口:
package com.unfbx.eventTest.mapstruct;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface ProductMapStruct {
ProductMapStruct instance = Mappers.getMapper(ProductMapStruct.class);
ProductV2 ProductToProductV2(Product product);
}
新建测试类:
package com.unfbx.eventTest.mapstruct;
import java.math.BigDecimal;
import java.util.Date;
public class Test {
public static void main(String[] args) {
Product product = new Product(1000,"耳机",new BigDecimal(10.50),"a.png",new Date());
ProductV2 productV2 = ProductMapStruct.instance.ProductToProductV2(product);
System.out.println(product);
System.out.println(productV2);
}
}
控制台输出
Product(id=1000, name=耳机, price=10.5, pic=a.png, createTime=Sun Jan 29 16:06:36 GMT+08:00 2023)
ProductV2(id=1000, name=耳机, price=10.5, pic=a.png, createTime=Sun Jan 29 16:06:36 GMT+08:00 2023)
三、Mapstruct为什么那么快?
查看编译后的class文件可以看到,类型转换接口在编译后会默认有一个实现类:
ProductMapStructImpl
package com.unfbx.eventTest.mapstruct;
import com.unfbx.eventTest.mapstruct.ProductV2.ProductV2Builder;
public class ProductMapStructImpl implements ProductMapStruct {
public ProductMapStructImpl() {
}
public ProductV2 ProductToProductV2(Product product) {
if (product == null) {
return null;
} else {
ProductV2Builder productV2 = ProductV2.builder();
productV2.id(product.getId());
productV2.name(product.getName());
productV2.price(product.getPrice());
productV2.pic(product.getPic());
productV2.createTime(product.getCreateTime());
return productV2.build();
}
}
}
里面做的就是属性映射。所有相较于BeanUtils的反射机制,肯定是这种方案会更加快。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭