头炸,po2vo
、vo2do
、do2dto
,一堆对象属性,取出来塞进来。要不是为了 DDD 架构下的各个分层防腐,真想一竿子怼下去。
那上 BeanUtils.copyProperties
呀,其实对象转换不只这个方法,还有同类的12种手段,但综合来看还是 MapStruct
在编译期生成x.set(y.get)代码的最终效果最好,整体压测数据如下:
BeanUtils.copyProperties
是大家代码里最常出现的工具类,但只要你不把它用错成Apache
包下的,而是使用 Spring 提供的,就基本还不会对性能造成多大影响。- 但如果说性能更好,可替代手动
get、set
的,还是MapStruct
更好用,因为它本身就是在编译期生成get、set
代码,和我们写get、set
一样。 - 其他一些组件包主要基于
AOP
、ASM
、CGlib
,的技术手段实现的,所以也会有相应的性能损耗。
咋办? 给每一个转换对象属性的操作都写一个 MapStruct
吗?也不合适呀,有些就是方法中很简单的操作一下,写写代码就能搞定,问题就是懒的写,一多了还容易写错。别提 BeanUtils.copyProperties 有时候确定有性能问题,从编码上还看不出来属性的添加和减少
所以 我要写个 IDEA Plugin 解决这个问题,目的就一个,通过 IDEA 插件开发能力,定义到我需要转换属性的2个对象,把2个对象的转换代码自动生成出来,并织入到我的对象定位位置上。
设计一个插件
我是这么思考的:在 IDEA 开发工程代码中,在需要转换的2个对象间,复制第一个对象和属性,再把光标定位到转换对象上,接下来我给它提供个按钮或者快捷键,一点就把所有转换代码生成出来,这样不就解决了需要手写的问题了吗,效果如下: