文档
- 快速开始
- Knife4j 4.0 迭代计划
- 如何贡献代码
- 序章
- 社区
- 增强特性
- 3.1 增强模式
- 3.2 i18n 国际化
- 3.3 接口添加作者
- 3.4 自定义文档
- 3.5 访问权限控制
- 3.6 接口排序
- 3.7 分组排序
- 3.8 请求参数缓存
- 3.9 动态请求参数
- 3.10 导出离线文档
- 3.11 过滤请求参数
- 3.12 包含请求参数
- 3.13 搜索API接口
- 3.14 清除缓存
- 3.15 动态请求参数添加文档注释
- 3.16 动态响应参数添加文档注释
- 3.17 自定义Host
- 3.18 afterScript
- 3.19 OAuth2
- 3.20 导出 Postman
- 3.21 全局参数
- 3.22 自定义 Swagger Models 名称
- 3.23 自定义主页内容
- 3.24 自定义 Footer
- 3.25 JSR303
- 3.26 禁用调试
- 3.27 禁用搜索框
- 3.28 禁用 OpenApi 结构显示
- 3.29 版本控制
- 生态中间件
- 升级
中间件
- 中间件介绍
- Aggregation 微服务聚合中间件
- Desktop 独立渲染组件
OAS 简介
- OAS 简介
- OpenAPI 规范
- Java 注解
实战指南
- 示例代码
- Spring 单体架构
- Spring 微服务架构
- OAuth 2.0
- 微服务聚合实战
- ASP.NET Core
- Springfox 源码系列
- Springfox 源码系列
- springfox 源码分析(一) 程序入口
- springfox 源码分析(二) 初探 mapstruct
- springfox 源码分析(三) 初探 Spring Plugin 插件系统
- springfox 源码分析(四) 配置类初始化
- springfox 源码分析(五) Web 配置类 Plugin 插件的使用
- springfox 源码分析(六) Web 配置类扫描包作用探索
- springfox 源码分析(七) 文档初始化
- springfox 源码分析(八) 遍历接口获取 Model 对象
- springfox 源码分析(九) 文档初始化分组
- springfox 源码分析(十) 遍历接口获取 Model 对象
- springfox 源码分析(十一) 自定义添加 Swagger Models 功能实现
- springfox 源码分析(十二) 遍历接口获取 ApiDescription 集合
- springfox 源码分析(十三) 自定义扩展实现接口的排序
- springfox 源码分析(十四) 归档得到 ApiListing 接口集合
- springfox 源码分析(十五) 归档得到 Documentation 文档对象
- springfox 源码分析(十六) 分组接口 swagger-resouces
- springfox 源码分析(十七) Swagger2 接口文档示例接口 api-docs
- springfox 源码分析(十八) 自定义扩展实现分组的排序
- springfox 源码分析(十九) guava 库学习
- springfox 源码分析(二十一) 忽略参数 Class 类型
springfox 源码分析(二) 初探 mapstruct
时间:2019-5-22 12:40:21
地点:单位
前言
在继续阅读学习springfox源码之前,我们需要先来学习一下mapstruct这个组件,只有在理解了mapstruct组件后,后面再看springfox的源码才不会有疑惑
因为之前并没有接触过mapstruct这个组件,所以记录一下学习的过程.
mapstruct
GitHub:https://github.com/mapstruct/mapstruct
文档:http://mapstruct.org/documentation/stable/reference/html/
一言一概之:Java bean mappings, the easy way!
简介
通过上面的最简单的一句话,很清晰的描述了mapstruct的作用,主要用于Java Bean的映射,这有点类似mybatis中的对象关系映射,但此处的mappings并非mybatis那样
MapStruct同时也是一个代码生成器,它基于约定优于配置方法极大地简化了Java bean类型之间映射的实现。
通过MapStruct生成的映射代码使用普通方法调用,因此快速,类型安全且易于理解。
作用
我们为什么需要 MapStruct
组件?
我们的应用程序通常会使用分层结构,分层时每层的对象会有不同的POJO对象(例如实体DO和业务DTO),实体DO定义了程序内部的逻辑属性,而DTO定义了外部业务逻辑关系
通常我们在应用程序通过DTO接受进来外部参数时,需要将之转化为内部DO对象,供内部调用,此时 MapStruct
组件正为此而生.
与其他映射框架相比,MapStruct在编译时生成bean映射,可确保高性能,允许快速的开发人员反馈和彻底的错误检查。
示例
先来看一组关于 MapStruct
的示例
在 maven
中引入 MapStruct
框架的jar包
<properties>
<mapstruct.version>1.2.0.Final</mapstruct.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version> <!-- or newer version -->
<configuration>
<source>1.8</source> <!-- depending on your project -->
<target>1.8</target> <!-- depending on your project -->
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
<compilerArgs>
<compilerArg>
-Amapstruct.suppressGeneratorTimestamp=true
</compilerArg>
<compilerArg>
-Amapstruct.suppressGeneratorVersionInfoComment=true
</compilerArg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
假设我们拥有DO和业务DTO对象 Car.java
、 CarDTO.java
Car.java:
public class Car {
private String name;
private String make;
private int numberOfSeats;
//getter and setter ,constructs
}
CarDTO.java
public class CarDTO {
private int seatCount;
//getter and setter ,constructs
}
按照传统的转换关系,如果我们不使用 MapStruct
框架的话,使用方式如下:
Car car=new Car("c1","m1",12);
CarDTO cd=new CarDTO();
//赋值
cd.setSeatCount(car.getNumberOfSeats());
按照以上的方式会有以下局限:
- 如果属性很多的话,需要写大量的赋值属性代码
- 代码极其繁琐
如果使用 MapStruct
框架,我们可以先声明一个 CarMapping
接口
/***
*
* @since:spring-plugin-demo 1.0
* @author <a href="mailto:xiaoymin@foxmail.com">xiaoymin@foxmail.com</a>
* 2019/05/21 21:40
*/
@Mapper
public interface CarMapper {
CarMapper INSTANCE= Mappers.getMapper(CarMapper.class);
@Mapping(source = "numberOfSeats", target = "seatCount")
CarDTO carToCarDto(Car car);
}
我们将所有DO对象及DTO对象的映射关系都定义在Mapper接口中,然后通过 @Mapper
注解标注
而此时我们使用的话也会有所变化:
//given
Car car = new Car( "Morris", "4make", 13 );
//when
CarDTO carDto = CarMapper.INSTANCE.carToCarDto( car );
//then
System.out.println(carDto.getSeatCount());
此时,我们程序在compile编译时, MapStruct
框架会为我们自动生成 CarMapper
的实现类:
此时在 generated-source
也会生成相应的java文件
CarMapperImpl.java
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2019-05-21T21:46:10+0800",
comments = "version: 1.2.0.Final, compiler: javac, environment: Java 1.8.0_111 (Oracle Corporation)"
)
public class CarMapperImpl implements CarMapper {
@Override
public CarDTO carToCarDto(Car car) {
if ( car == null ) {
return null;
}
CarDTO carDTO = new CarDTO();
carDTO.setSeatCount( car.getNumberOfSeats() );
return carDTO;
}
}
映射接口自动帮助我们实现了Java实体的转换
总结
了解了mapstruct的功能,我们在接下来学习springfox的源码时会轻松很多.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论