常用開發庫 - MapStruct工具庫詳解
MapStruct是一款非常實用Java工具,主要用於解決對象之間的拷貝問題,比如PO/DTO/VO/QueryParam之間的轉換問題。區別於BeanUtils這種通過反射,它通過編譯器編譯生成常規方法,將可以很大程度上提升效率。@pdai
為什么會引入MapStruct這類工具
首先看下這類工具出現的背景。@pdai
JavaBean 問題引入
在開發的時候經常會有業務代碼之間有很多的 JavaBean 之間的相互轉化,比如PO/DTO/VO/QueryParam之間的轉換問題。之前我們的做法是:
-
拷貝技術
- org.apache.commons.beanutils.PropertyUtils.copyProperties
- org.apache.commons.beanutils.BeanUtils.copyProperties
- org.springframework.beans.BeanUtils.copyProperties
- net.sf.cglib.beans.BeanCopier
-
純get/set
- 輔助IDE插件拷貝對象時可以自動set所有方法字段 (這種方式可能有些開發人員不清楚)
- 不僅看上去冗余添加新的字段時依然需要手動
- 開發效率比較低
MapStruct 帶來的改變
MapSturct 是一個生成類型安全, 高性能且無依賴的 JavaBean 映射代碼的注解處理器(annotation processor)。
工具可以幫我們實現 JavaBean 之間的轉換, 通過注解的方式。
同時, 作為一個工具類,相比於手寫, 其應該具有便捷, 不容易出錯的特點。
MapStruct入門例子
這里展示最基本的PO轉VO的例子,使用的是IDEA + Lombok + MapStruct
Pom.xml
注意:基於當前IDEA設置並不需要
mapstruct-processor
的依賴
一般來說會加載兩個包:
org.mapstruct:mapstruct
: 包含Mapstruct核心,比如注解等;如果是mapstruct-jdk8
會引入一些jdk8的語言特性;org.mapstruct:mapstruct-processor
: 處理注解用的,可以根據注解自動生成mapstruct的mapperImpl類
如下示例基於IDEA實現,可以在build階段的annotationProcessorPaths
中配置mapstruct-processor
的path。
<packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <org.mapstruct.version>1.4.0.Beta3</org.mapstruct.version> <org.projectlombok.version>1.18.12</org.projectlombok.version> </properties> <dependencies> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${org.mapstruct.version}</version> </dependency> <!-- lombok dependencies should not end up on classpath --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${org.projectlombok.version}</version> <scope>provided</scope> </dependency> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.71</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1