1.什么是MapStruct
1.1JavaBean的困扰
对于代码中JavaBean之间的转换,一直是困扰我很久的事情。在开发的时候我看到业务代码之间有很多的JavaBean之间的相互转化,非常的影响观感,却又不得不存在。我后来想的一个办法就是通过反射,或者自己写很多的转换器。
第一种通过反射的方法确实比较方便,但是现在无论是BeanUtils,BeanCopier等在使用反射的时候都会影响到性能。虽然我们可以进行反射信息的缓存来提高性能。但是像这种的话,需要类型和名称都一样才会进行映射,有很多时候,由于不同的团队之间使用的名词不一样,还是需要很多的手动set/get等功能。
第二种的话就是会很浪费时间,而且在添加新的字段的时候也要进行方法的修改。不过,由于不需要进行反射,其性能是很高的。推荐:Java进阶视频资源
1.2MapStruct带来的改变
MapSturct是一个生成类型安全,高性能且无依赖的JavaBean映射代码的注解处理器(annotationprocessor)。
注解处理器可以生成JavaBean之间那的映射代码类型安全,高性能,无依赖性
2.MapStruct入门
2.1添加依赖
2.2po类
2.3dto类
2.4创建转换接口
2.5测试方法
2.6运行效果
2.7查看编译的class
底层通过自动取值赋值操作完成
3.MapStruct优点分析
3.1性能高
这是相对反射来说的,反射需要去读取字节码的内容,花销会比较大。而通过MapStruct来生成的代码,其类似于人手写。速度上可以得到保证。
3.2使用简单
如果是完全映射的,使用起来肯定没有反射简单。用类似BeanUtils这些工具一条语句就搞定了。但是,如果需要进行特殊的匹配(特殊类型转换,多对一转换等),其相对来说也是比较简单的。
基本上,使用的时候,我们只需要声明一个接口,接口下写对应的方法,就可以使用了。当然,如果有特殊情况,是需要额外处理的。推荐:Java进阶视频资源
3.3代码独立
生成的代码是对立的,没有运行时的依赖。
3.4易于debug
在我们生成的代码中,我们可以轻易的进行debug。
4.MapStruct使用案例
4.1属性名称相同
在实现类的时候,如果属性名称相同,则会进行对应的转化。通过此种方式,我们可以快速的编写出转换的方法。(入门案例)
4.2属性名不相同
属性名不相同,在需要进行互相转化的时候,则我们可以通过
Mapping注解来进行转化。source需要转换的对接,通常是入参target转换的对接,通常是出参igno忽略,默认false不忽略,需要忽略设置为truedefaultValue默认值expssions可以通过表达式来构造一些简单的转化关系。虽然设计的时候想兼容很多语言,不过目前只能写Java代码。
Mappings({
Mapping(source="birthdate",target="birth"),//属性名不一致映射Mapping(target="birthformat",expssion="java(org.apache.