背景
所有还要从我的上一家公司讲起,我的上一家公司是一家独角兽企业,说大不大说小不小的那种,公司气氛也是比拟重视技术,我过后入职之后的第一课就是浏览咱们 CTO 写的开发标准,其中他把 Java 我的项目的目录构造划分的十分分明,大略是上面这个样子的:
我过后感觉这种分层构造划分的十分优雅与正当,当然以上只是一个大略,更细节的分层我没有表露,然而随之而来在理论中应用的过程中,这样一个三层构造也带来了一个问题,那就是对象传输十分麻烦,因为每层都会有一个特有的对象。
上面我举一个例子,如果咱们要插入一个 User 对象,那么它可能要通过以下二次对象转换:
以上只是一个比较简单的例子,置信大家曾经能够从中看出开发者们须要写一些很繁琐然而很没意思的代码(手动 get/set
),比方上图中的三个对象可能字段都是截然不同的,但却须要反复写两次 Convert
去进行对象的转换。
当然这样设计当然也有益处,那就是解耦,比方咱们当初用的数据库是 Mysql
,如果要换成 Mongo
只须要把第二次对象转换的代码略微批改一下即可,这也是这样设计的初衷。
常见计划
这么一个繁琐的事难道就没有一些计划进行解决吗?当然有,一般来说有两种形式:
- BeanUtil / JSONObject
- MapStruct
先来说第一种形式吧,无论 BeanUtil
是深拷贝还是浅拷贝,它对咱们开发者来说细节都是不可见的,一旦某个字段赋值呈现了问题,咱们并没有方法去进行代码的排查,因为咱们没方法查看对象转换的细节,JSONObject
也有雷同的问题。
而后就是第二种形式,MapStruct
在前段时间是一个十分火的计划,它和 Lombok
十分相似,在代码编译期帮忙咱们去生成对象之间的转换代码,咱们也能够通过 IDEA 的提醒去查看编译后的代码,我司除了手动 get/set
代码,最多的就是应用 MapStruct 进行解决。
然而对我而言,MapStruct 还是有一些毛病,首先我的 IDEA 常常没有查看编译后代码的提醒,其次就是如果转换对象的某个字段不一样的时候,须要学习 MapStruct 的一些用法进行解决,有肯定的学习累赘,反正我到当初都没学会😂。
我的计划
最终我为了不便,决定本人开发一个 IDEA 插件并起名为 BeanMappingKey
,目前曾经迭代到 1.X 版本,次要思维是通过插件的形式为咱们须要转换的对象主动生成转换代码。
目前临时有三种用法:
- 依据对象生成对应的 get/set 办法,反对建造者模式。
- 依据 Class 生成对应的 get/set 办法,反对建造者模式。
- 依据一个办法的入参和返回值,进行对象的转换代码生成,反对建造者模式。
其中,第一种和第二种生成起来是差不多的,具体可见以下例子:
上图的示例,是咱们选中一个 Class 类进行代码的生成,依据这个类是否是建造者模式,来生成对应格调的代码,生成之后的代码被拷贝到剪贴板上,能够自在粘贴。
第二种形式,对于我来说是更加罕用的,因为转换代码往往是写在一个办法外面的,通过选中办法名匹配入参和返回值进行代码生成,相似上面的例子:
匹配的逻辑就是依据字段名进行匹配,匹配失败的话则会留空,同时不只反对一个入参,能够对多个入参进行匹配,就像上面这样:
以上就是我对这个插件的介绍了,各位读者如果有趣味的话能够在 IDEA 下面下载上试试:
-
在
Windows
零碎上装置:File
>Settings
>Plugins
>Browse repositories...
>Search for "BeanMappingKey"
>Install Plugin
-
在
MacOS
零碎上装置:Preferences
>Settings
>Plugins
>Browse repositories...
>Search for "BeanMappingKey"
>Install Plugin
-
手动装置
:- 下载 latest release 之后,抉择
Preferences
>Plugins
>Install plugin from disk...
- 下载 latest release 之后,抉择
注:暂且只反对 2020 以上版本的 IDEA,装置之后无需重启。
目前我的这个插件仍然还在欠缺中,对于简单类型反对的还不够欠缺,比方对象外面嵌套对象的状况,我打算下一阶段持续对这块痛点进行降级欠缺,上面是此插件的地址:
- Github:https://github.com/rookie-ricardo/BeanMappingKey
- Plugin:https://plugins.jetbrains.com/plugin/18264-beanmappingkey
2022-06-06 更新:插件更新 2.0 版本,曾经反对对象嵌套的生成,欢送大家在 IDEA 中下载应用。