我们开发过程中会遇到很多bean拷贝的过程,最简单粗暴得方法就是set/get方法,当然这也是最臃肿的方法,代码显得过于冗长和笨重,其次还有框架BeanUtils在使用反射的时候都会影响到性能。虽然我们可以进行反射信息的缓存来提高性能。但是像这种的话,需要类型和名称都一样才会进行映射,有很多时候,由于不同的团队之间使用的名词不一样,还是需要很多的手动 set/get 等功能,而怎么才能又安全又优雅?
MapStruct注释处理器
MapStruct是一个Java注释处理器,用于生成类型安全的bean映射类。
Mapstruct 与过去常用的beanUtil转换有高性能的转换优势,编译期自动生成的mapper实现类能够更加优雅的来实现各种隐式类型转换,以实现快速而又敏捷的开发,告别臃肿的手动get、set
优点:
1,通过使用普通方法调用get,set 而不是反射来快速执行
2,变异时类型安全性:只能映射相互映射的对象和属性,不能将order实体以外映射到customer DTO 等
3,如果有映射不完整时(映射不完整或找不到正确的映射方法或类型转换异常),编译会抛出异常
4,可以通过freemarker定制化开发
工作组件:
org.mapstruct:mapstruct: 包含必需的注释 例如:@Mapping
org。mapstruct:mapstruct-processor:包含注释处理器,该注释处理器生成映射器实现
如何使用?
1,首先引入pom(版本最好在1.16.16以上)通常是和lombok一起使用
<properties>
<mapstruct.version>1.2.0.Final</mapstruct.version>
</properties>
<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>
2,安装idea中的mapstruct support 插件 安装并重启idea(不是必须项,个人感觉好用)
3,定义一个映射器
在所需的映射方法定义一个接口 并用@Mapper注释(在生成的实现中,源类型的所有可读属性都将复制到目标类型的相对应的属性中),如果目标实体中的名称不相同,可以通过@Mapping注释指定其名称进行对应,如果某个字段不想映射可以使用@Mapping(ignore = true) 排除该字段,另外target是必须添加的,source可以不添加(如果不添加则直接使用默认defaultValue)
另:还有其他的功能 比如组合映射,使用表达式映射,使用其他的值,嵌套映射,逆映射,继承与共享配置,还可使用自定义类型转换方法等等可以自行查看。