一、开发背景
平时在开发SpringBoot项目时,需要创建和实体类对应的 Respository,Service,ServiceImpl以及Controller类,同类文件格式基本一致,只是实体名称不一样。个人喜欢复制粘贴后再进行修改,然而偶尔一不小心手抖,检查也得半天。
所以出于代码能实现的绝不要自己费劲的偷懒原则,准备开发一款 IDEA 插件,能够实现最简版的自动创建实体对应文件的功能,以提高工作效率,改善编码心情。
二、开发步骤
1.开发环境
IDEA社区版(Community Edition)
特点: 完全免费,代码开源,但是缺少一些旗舰版中的高级特性。
推荐使用社区版而不是旗舰版,因为社区版是开源的,在开发插件的时候,有源代码调试会比较方便。
2.详细步骤
(1). 新建插件项目
在 IDEA 中选择 File -> New -> Project,点击 IntelliJ Platform Plugin,选择SDK,点击下一步:
(2). 给自己的插件起个好听的名字
创建好的工程目录结构:
(3). 修改 plugin.xml 的配置
<idea-plugin>
<id>com.plugin.id</id>
<name>CodeAutoCreate</name>
<version>1.0</version>
<vendor email="Your email address" url="http://www.yourco1mpany.com">Asiainfo</vendor>
<description>This plugin can help you create entity-related files</description>
<idea-version since-build="173.0"/>
<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
</extensions>
<actions>
<action class="plugin.MyAnAction" id="codeCreate" text="Entity Code Auto Create">
<add-to-group group-id="WindowMenu" anchor="first"/>
</action>
</actions>
</idea-plugin>
配置项介绍:
- actions配置所有的操作菜单;
- MainMenu 是主菜单,和File,Help等菜单同级;
- add-to-group下配置的是该 group 的子菜单;
- EditorPopupMenu 是在代码区右键的弹出菜单;
- 所有的菜单列表可以在resources.jar PlatformActions.xml下查看;
- anchor 设置菜单所在位置,末尾,首位等。
(4). 实现 AnAction 的 actionPerformed 方法
package plugin;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
public class MyAnAction extends AnAction {
private PsiDirectory workDir;
protected Project project;
protected PsiDirectory containerDirectory;
@Override
public void actionPerformed(@NotNull AnActionEvent anActionEvent) {
// 获取需要处理的entity类
PsiClass aClass = this.getEditingClass(anActionEvent);
if (null == aClass) {
return;
}
// 如果没有被Entity注解,则不生成
if (null == aClass.getAnnotation("javax.persistence.Entity")) {
return;
}
// 获取当前实体所在目录的上级目录,需要严格按说明中的目录组织,其它目录不考虑
workDir = aClass.getContainingFile().getContainingDirectory().getParentDirectory();
Map<String, String> configMap = ConfigDispose.getConfigPath(project, aClass);
// 自动创建服务文件
ClassCreator.createServiceFile(workDir, project, aClass, configMap);
// 自动创建服务实现文件
ClassCreator.createServiceImplFile(workDir, project, aClass, configMap);
// 自动创建控制器文件
ClassCreator.createControllerFile(workDir, project, aClass, configMap);
// 自动创建repository文件
ClassCreator.createRepositoryFile(workDir, project, aClass, configMap);
}
public PsiClass getEditingClass(AnActionEvent anActionEvent) {
// 获取当前项目
project = anActionEvent.getProject();
if (null == project) {
return null;
}
// 获取当前的编辑器对象
Editor editor = anActionEvent.getData(CommonDataKeys.EDITOR);
if (null == editor) {
return null;
}
// 获取当前编辑的文件
PsiFile psiFile = PsiDocumentManager.getInstance(anActionEvent.getProject()).getPsiFile(editor.getDocument());
if (!(psiFile instanceof PsiJavaFile)) {
return null;
}
PsiJavaFile javaFile = (PsiJavaFile) psiFile;
// 获取JavaFile中的Class(一个文件中可能会定义有多个Class,因此返回的是一个数组)
PsiClass[] classes = javaFile.getClasses();
if (0 == classes.length) {
return null;
}
containerDirectory = classes[0].getContainingFile().getContainingDirectory();
return classes[0];
}
}
(5). 插件运行调试
对运行参数进行设置:
填写名字,选择插件项目以及JRE路径:
设置好之后点击运行,此时会弹出一个新的IDEA窗口,我们可以在该窗口里选择新建或打开已有项目来调试我们的插件:
(6). 插件编译打包
点击 Bulid -> Prepare All plugin Modules For Deployment
编译完成后,在工程第一级目录下会生成一个 codeAutoCreate.jar:
(7). 安装插件
点击File -> Settings -> Plugins 右侧的设置按钮,选择 Install plugin from Disk,选择刚刚生成的 jar 包并点击确定:
(8). 运行插件
新建一个用于测试插件的 SpringBoot 项目,在java目录下创建 entity 包,new 一个 User 实体类并打开(也就是被编辑的类):
然后点击 Window 菜单,第一个子菜单就是我们生成的插件:
点击该菜单后,UserController,UserService,UserServiceImpl,UserRepository 文件就会自动生成了:
自动生成代码插件源码地址如下:
https://github.com/jichunyang19931023/codeAutoCreate