开发了一个用于在代码中校验和执行sql的插件,效果如下:

在mapper.java中 ,右键选择 goto->testSQL

以json形式输入参数,即可将执行结果显示出来

但是大多数场景,我只需要看下对于的sql对不对,那么就直接
goto->testValid
会使用自动生成的默认参数去执行sql,不再需要自己输入参数

同理的,复杂的参数也支持,insert update delete 也支持

goto->testValid也可以使用默认参数测试

此次演示用的xml,就是mybatis正常的带标签的xml
支持大多数的xml标签解析

插件 github源码地址:
https://github.com/xiaoxinglai/crudboy

1.插件原理

IDEA 提供了一个IntelliJ Platform SDK开发工具包,里面开放了各种API,可以基于这些API拓展定制出自己需要的功能。
其中最重要的是:
程序结构接口(PSI)。这是一组功能,可用于解析文件,构建代码的丰富句法和语义模型以及从此数据构建索引,从快速导航到文件,类型和符号,到代码完成窗口的内容并查找用法,代码检查和代码重写,快速修复或重构以及许多其他功能。
可以实现诸如以下功能:
自定义语言支持
框架整合
工具整合
用户界面附加组件 等

开发必看:
https://www.jetbrains.org/intellij/sdk/docs/basics/types_of_plugins.html
官网文档介绍

2.开发环境搭建

https://cloud.tencent.com/developer/article/1348741 参考这里

3.项目总结

3.1初始化项目之后,结构大致如下

其中 plugin.xml是核心
在plugin.xml中

这里用到了IOC的原理,插件会在加载的时候初始化定义的类

这里面是初始化的是配置面板的类

3.2 action

action是代表的每一个触发动作

application-components是定义组件的生命周期

3.2 components生命周期

生命周期:负责生命周期管理以及连接组件之间的相互依赖关系。
Application level components,在 IDEA 启动的时候创建和初始化,可以使用 getComponent(Class) 获取它们。

Project level components,在 IDEA 中每个 Project 实例创建的,甚至可以为未打开的项目创建组件,可以使用 getComponent(Class)方法从 Project 实例中获取它们。

Module level components,它们是为 IDEA 中加载的每个项目中每个模块创建,使用 getComponent(Class)方法可以从 Module 实例获取模块级别组件。

顺序:
1.创建,调用构造函数
2.初始化,initComponent 调用该方法(如果组件实现 ApplicationComponent 接口)

3.配置,保存和加载每个组件的状态。(PersistentStateComponent 和 JDOMExternalizable,实例化配置)。

3.注册,对于模块组件,将调用接口的 moduleAdded 方法 ModuleComponent 将模块添加到项目中,对于项目组件,调用接口的 projectOpened 方法 ProjectComponent 加载项目。

4.保存配置,JDOMExternalizable,PersistentStateComponent 的调用。

5.销毁,disposeComponent 调用

线程模型

平台相关数据结构由读/写锁覆盖,适用于 PSI,VFS 和项目模型。允许从任何线程读取数据。从 UI 线程读取数据不需要任何特殊的工作。但是,从任何其他线程执行的读取操作都需要使用 ApplicationManager.getApplication().runReadAction()或 ReadAction.run/compute。

仅允许从 UI 线程写入数据,并且写入操作始终需要用 ApplicationManager.getApplication().runWriteAction()或 WriteAction.run()/compute()。

后台流程管理

后台进度由 ProgressManager 类管理,该类有很多方法可以使用模式(对话框),非模式(在状态栏中可见)或不可见进度来执行给定代码。在所有情况下,代码都是在与 ProgressIndicator 对象关联的后台线程上执行的。

讯息传递
平台中可用的消息传递基础结构,基于 Observer 设计模式扩展实现的,通过该模式能够更好的梳理的一对多关系,实现提供了附加功能,例如在层次结构上进行广播和特殊的嵌套事件处理(此处的嵌套事件是指从另一个事件的回调中(直接或间接)触发新事件的情况)。

这个组件是必须在plugin.xml里面要配置的

然后action

所有的触发操作,都需要继承一个Action类

在actionPerformed的方法中,可以通过AnActionEvent的参数拿到相关的参数,比如说上面的例子,获取当前类的操作路径,并弹窗出来。

然后需要在plugin.xml中配置,它分组在GenerateGroup中

效果如下

3.3 面板

其次,就是有时候,我们会看到在项目里面,需要加配置,并且需要保存下来,比如说maven插件里面的配置maven仓库地址。

我们先创建一个面板

创建之后是有两个类
一个xx.form 一个是xx.java

那么问题来了,面板上新增的数据,如何保存呢?
idea的插件,是将在配置面板上的数据,保存在了xml中,下次打开的时候,再次读取,便可以恢复到之前的配置状态。

为此,我们需要实现一个PersistentStateComponent类的子类,用于保存配置中的数据。

然后也是要在plugin.xml里面配置,这里其实是提供了一个ioc容器的作用

这样任意地方 需要取这个配置的值的时候,使用ServiceManager.getService(CrudBoySettings.class);即可取出来了。

那么最终,要这个配置面板和保存配置的seting整合起来
需要一个SearchableConfigurable配置类的子类

效果如下

总结:
action的子类->所有的触发事件 比如说菜单 点击
PersistentStateComponent的子类->配置保存
SearchableConfigurable子类->配置面板

4.常用API

4.1 获取plugin.xml里面配置的类
 ServiceManager.getService(XXXX.class);
4.2 获取选择的文件夹和项目
   IdeView ideView = (IdeView)anActionEvent.getRequiredData(LangDataKeys.IDE_VIEW);//选择的文件夹this.psiDirectory = ideView.getOrChooseDirectory();//选择的项目this.project = this.psiDirectory.getProject();
4.2 获取选中的类名
     //  e为 AnActionEvent PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);//获取选中的类名String name = psiFile.getVirtualFile().getName();
4.3 获取鼠标选中的元素
     //获取鼠标所在的元素PsiElement psiElement = e.getData(PlatformDataKeys.PSI_ELEMENT);
4.4 获取方法的参数
  //获取方法的参数PsiParameter[] psiParameters = ((PsiMethodImpl) psiElement).getParameterList().getParameters();
4.5 获取指定文件名的文件
   PsiFile[] psiFiles = FilenameIndex.getFilesByName(project, name, GlobalSearchScope.projectScope(project));

等等 其他常用的还有根据模版生成代码等,在JavaDirectoryServiceImpl类下面的方法

详细可以参考如下资料 或者参考源码
这个插件也实现了根据数据库表自动生成DO mapper mapper.xml的功能

参考资料:

1.开发环境搭建
https://cloud.tencent.com/developer/article/1348741
腾讯云的这篇文章讲的很清晰。

2.开发手册 参考官网(ps:要有耐心)
https://www.jetbrains.org/intellij/sdk/docs/welcome.html

3.值得参考的项目(很多操作和api 只有在其他项目找)

https://my.oschina.net/u/2526698/blog/1548929 (快速定位到mybatis mapper文件中的sql)

https://blog.csdn.net/soledadzz/article/details/104204791 (结构介绍)

4.概念
https://www.jianshu.com/p/c169ef3c3eed 虚拟文件系统

Idea插件开发总结相关推荐

  1. ATS插件开发中内存泄露问题的解决方法探讨

    接触ATS开发已经有几年了,开发过内核的模块,也从事过插件的开发.内存泄露问题一直是一个困扰大多数ATS开发者的头疼的问题,下面说说我自己的感受和思考.这里这关注ATS插件开发这个话题.源码的exam ...

  2. jQuery插件开发 - 其实很简单

    [前言] jQuery已经被广泛使用,凭借其简洁的API,对DOM强大的操控性,易扩展性越来越受到web开发人员的喜爱,我在社区也发布了很多的jQuery插件,经常有人询问一些技巧,因此干脆写这么一篇 ...

  3. jquery 插件开发的作用域及基础

    2019独角兽企业重金招聘Python工程师标准>>> 之前一直有开发jquery插件的冲动,所以一直想学习如何进行插件开发,最近一个项目需要使用图片上传组件及自动无限下拉组件,百度 ...

  4. Nutch插件开发及发布流程

    2019独角兽企业重金招聘Python工程师标准>>>  一,插件开发流程: 1,Nutch开发客户端环境搭建 2,plugin的源代码则保存在/src/java/org/apach ...

  5. 深入理解 Mybatis 插件开发

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:风一样的码农 cnblogs.com/chenpi/p/10 ...

  6. 【直播回顾】蚂蚁金服高级开发工程师萧恺:IDEA 插件开发入门教程

    主讲人:萧恺(蚂蚁金服-支付宝事业群-高级开发工程师) 本名:肖汉松 讲师介绍: 热爱阅读,喜欢挑战,热衷尝试新的技术,关注技术背后的原理. 关注领域:Java 服务端开发,分布式系统 关注语言:Ja ...

  7. 黄聪:《跟黄聪学WordPress插件开发》

    续<跟黄聪学WordPress主题开发>之后,又一个作品完成!<跟黄聪学Wordpress插件开发>,国内最好的Wordpress插件开发视频教程!! 目录预览: WordPr ...

  8. discuz x3插件开发傻瓜图文教程,用demo说话

    2019独角兽企业重金招聘Python工程师标准>>> 此demo功能是在模板footer部位插入一段javascript代码,这段代码可以是alert提示,也可以是加载广告等等. ...

  9. chrome 插件开发各种功能demo_Chrome 插件开发全攻略

    Chrome 浏览器相信大家都用得比较多,有很多的优点,比如简洁.强大的开发者工具等,但是更让大家映像深刻的是有各种各样有趣.有用的插件,今天要给大家推荐的开源项目是 Chrome 插件开发全攻略,你 ...

  10. jQuery插件开发--(转)

    1,开始 可以通过为jQuery.fn增加一个新的函数来编写jQuery插件.属性的名字就是你的插件的名字: jQuery.fn.myPlugin = function(){ //开始写你的代码吧! ...

最新文章

  1. java输出一个Int数据的补码
  2. jquery animate自定义动画
  3. Oracle绑定变量和审计功能影响性能吗?Python告诉你
  4. Android 系统(240)---底层如何简易的获取一个从AP传下来的parameter(flag)
  5. CIO感悟:IT人转型之“势、道、术”
  6. 怎样得到对方的电脑名_吸引力法则让他想念你,让对方主动找你
  7. yum安装wget失败,替换yum源为阿里yum源并重亲安装
  8. 一个简单的BitTorrent客户端实现(五):tracker manager和tracker实现
  9. 虚幻四蓝图实战(下车减速人物加速蓝图接口通信)
  10. 存储过程常用开关(set命令解析)
  11. 微信小程序聊天客服工具
  12. 来聊聊,今年各互联网大厂的年终奖......
  13. 2018-12-16【训练日记】
  14. Django知识点:认识Django
  15. SpringBoot返回的 JSON 带有斜杠 转义
  16. 插入 PNG 图片至 Excel
  17. (附源码)php校园二手交易网站 毕业设计041148
  18. Android V1签名与校验原理分析(全网最全最详细)
  19. 开发工具界面没了,但是后台进程还在跑,怎么找回来
  20. 变压器励磁电感以及漏感

热门文章

  1. 下载离线 Visual Studio 离线安装包
  2. PLSQL Developer 安装使用教程详解
  3. 23种设计模式之builder模式
  4. 8uftp怎么连到,8uftp怎么连到服务器
  5. 蓝牙模块:详解蓝牙通信模块的使用
  6. desc和asc用法
  7. PotPlayer+SVP4视频补帧简易教程
  8. 511遇见易语言列表框去重复项目到列表框
  9. 利用动态数组生成魔方矩阵
  10. 记录|深度学习100例-卷积神经网络(CNN)minist数字分类 | 第1天