最终效果
为了留住兄弟们继续看下去,还是先来看看最终效果吧
在新建一个实体类的时候把相关联的mapper、service都一并生成
当做出这个效果之后,面对一个结构复杂的DDD的项目,我再也不用新建一个实体类,新建一个mapper,新建一个service,新建一个model,再来一个转换类,再来一个。。。。。我想,这大概就是工业革命吧
难道逆向工程不香么?
什么?逆向工程能用来装逼么!谁能拒绝。。。
调研Api
当然可以上来就直接开搞,毕竟用模版生成文件这种操作,用java实现起来也不是什么难事。但是如果仅仅是实现一个简单的功能,就很难提起兴致。如果在研究兴趣的同时,还能提高一些专业能力的话,岂不美哉
那我们来分析一下,针对这个点子,需要做的事情其实很少
- 找到需要生成文件目录
- 创建一些模版
- 把文件生成过去
但是事情往往没有想象中这么简单
- 这些目录找起来并不轻松,在一个陌生的项目环境下,直接通过文件系统找文件目录总是不那么靠谱
- 直接在插件中写死模版当然很简单,但是损失了不小的灵活性,总不能每次新建一个项目就去把插件发一个版本
- 生成文件的话其实问题不大,但是总觉得用原生的硬搞不是特别优雅,既然我们在IDEA的地盘做事,就要尽量按照他的风格来,应该也可以得到一些便利
针对这些问题,我的选择当然是去看IDEA的源码了,既做插件,又能锻炼阅读源码的能力,一菜多吃!
既然这次主要是文件生成操作,首先肯定是关注创建Class这个Action,大家都是新建文件,只是目录不同,在这个Action中肯定可以找到很多线索。
总之,最后定位到了CreateClassAction
这个类,源码我就不全都截出来给大家了,具体的逻辑部分有兴趣的兄弟可以自己去自己研究一下,只说我这边研究得到的线索
创建输入类名的弹窗
这个类中有一个比较有用的方法CreateClassAction. buildDialog(Project project, PsiDirectory directory,CreateFileFromTemplateDialog.Builder builder)
protected void buildDialog(final Project project, PsiDirectory directory, CreateFileFromTemplateDialog.Builder builder) {
builder.setTitle(JavaBundle.message("action.create.new.class", new Object[0])).addKind(JavaPsiBundle.message("node.class.tooltip", new Object[0]), PlatformIcons.CLASS_ICON, "Class"