前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实战之mapstruct的妙用

实战之mapstruct的妙用

作者头像
山行AI
发布2019-06-28 16:34:17
4.9K0
发布2019-06-28 16:34:17
举报
文章被收录于专栏:山行AI山行AI

1. lombok

lombok是一款插件,在常用的开发工具eclipse和idea中都很好进行安装,具体安装方式请自行网上寻找。lombok提供了一些的的注解,会在编译期帮你自动生成一些代码。

1. 常用的注解有:

  • @Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode的总和。 _ @Builder可以用builder形式构造方法。
  • @NoArgsConstructor无参构造器。
  • @AllArgsConstructor有参构造器。
  • @Getter get方法。
  • @Setter set方法。

2. 使用步骤

1. 引入依赖
代码语言:javascript
复制
<dependency>   <groupId>org.projectlombok</groupId>   <artifactId>lombok</artifactId>   <version>1.16.18</version></dependency>
2. 在开发工具上安装相应的插件

idea上需要安装plugin:

2. mapstruct

是提供了很多注解工具的一款插件,依赖于lombok,在这里主要介绍它的bean实例转化的用法。

1. 关于bean copy

有很多方式,比如自己new实例手动set来完成转化,还可以通过反射工具类BeanUtils,BeanCopier...(这里不去深究深copy和浅copy的概念)。使用mapstruct的注解可以在编译时自动生成bean转化的对应类和方法。

2. 使用步骤

1. 引入依赖
代码语言:javascript
复制
<lombok.version>1.16.18</lombok.version><mapstruct-jdk8.version>1.2.0.Final</mapstruct-jdk8.version><mapstruct-processor.version>1.2.0.Final</mapstruct-processor.version><dependency>   <groupId>org.projectlombok</groupId>   <artifactId>lombok</artifactId></dependency><dependency>   <groupId>org.mapstruct</groupId>   <artifactId>mapstruct-jdk8</artifactId>   <version>${mapstruct-jdk8.version}</version></dependency><dependency>    <groupId>org.mapstruct</groupId>    <artifactId>mapstruct-processor</artifactId>    <version>${mapstruct-processor.version}</version>    <scope>provided</scope></dependency>
2. 定义converter
代码语言:javascript
复制
import org.mapstruct.BeanMapping;import org.mapstruct.Mapper;import org.mapstruct.factory.Mappers;import org.mapstruct.Mapping;import org.mapstruct.Mappings;@Mapperpublic interface MessageConverter {    MessageConverter INSTANCE = Mappers.getMapper(MessageConverter.class);    @BeanMapping(resultType = MessageMongoDto.class)    MessageMongoDto messageTo2Dto(MessageTo messageTo);}@Mapperpublic interface ContentDataConverter {      ContentDataConverter INSTANCE = Mappers.getMapper(ContentDataConverter.class);      @Mappings({                @Mapping(source = "contentId",target = "contentId" )        })        ContentDataMongoTo contentDto2To(ContentDataMongoDto contentDataMongoDto);}

执行mvn clean install之后在工程的target\generated-sources目录里面会有对应的实现类生成:

代码语言:javascript
复制
@Generated(    value = "org.mapstruct.ap.MappingProcessor",    date = "2019-06-14T11:55:43+0800",    comments = "version: 1.2.0.Final, compiler: javac, environment: Java 1.8.0_121 (Oracle Corporation)")public class MessageConverterImpl implements MessageConverter {    @Override    public MessageMongoDto messageTo2Dto(MessageTo messageTo) {        if ( messageTo == null ) {            return null;        }        MessageMongoDto messageMongoDto = new MessageMongoDto();        messageMongoDto.setId( messageTo.getId() );        messageMongoDto.setSendId( messageTo.getSendId() );        messageMongoDto.setTitle( messageTo.getTitle() );        messageMongoDto.setText( messageTo.getText() );        messageMongoDto.setChargeType( messageTo.getChargeType() );        return messageMongoDto;    }}以及:@Generated(    value = "org.mapstruct.ap.MappingProcessor",    date = "2019-06-14T11:55:44+0800",    comments = "version: 1.2.0.Final, compiler: javac, environment: Java 1.8.0_121 (Oracle Corporation)")public class ContentDataConverterImpl implements ContentDataConverter {    @Override    public ContentDataMongoTo contentDto2To(ContentDataMongoDto contentDataMongoDto) {        if ( contentDataMongoDto == null ) {            return null;        }        ContentDataMongoTo contentDataMongoTo = new ContentDataMongoTo();        contentDataMongoTo.setContentId( contentDataMongoDto.getContentId() );        contentDataMongoTo.setContentType( contentDataMongoDto.getContentType() );        contentDataMongoTo.setCreateTime( contentDataMongoDto.getCreateTime() );        contentDataMongoTo.setTagNames( contentDataMongoDto.getTagNames() );        return contentDataMongoTo;    }}    

接下来就可以直接通过MessageConverter.INSTANCE.messageTo2Dto进行方法的调用。

常用注解使用:

  • @BeanMapping 转换整个bean
  • @Mappings 里面放置一系列的mapping
  • @Mapping 可以针对字段名不一样的两个属性的映射,如果不指明则会去找相同名字的属性

可以看到,这样就省去了自己手动set的麻烦,而且还能节省掉反射带来的性能开销。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开发架构二三事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. lombok
    • 1. 常用的注解有:
      • 2. 使用步骤
        • 1. 引入依赖
        • 2. 在开发工具上安装相应的插件
    • 2. mapstruct
      • 1. 关于bean copy
        • 2. 使用步骤
          • 1. 引入依赖
          • 2. 定义converter
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档