Idea插件开发总结
开发了一个用于在代码中校验和执行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插件开发总结相关推荐
- ATS插件开发中内存泄露问题的解决方法探讨
接触ATS开发已经有几年了,开发过内核的模块,也从事过插件的开发.内存泄露问题一直是一个困扰大多数ATS开发者的头疼的问题,下面说说我自己的感受和思考.这里这关注ATS插件开发这个话题.源码的exam ...
- jQuery插件开发 - 其实很简单
[前言] jQuery已经被广泛使用,凭借其简洁的API,对DOM强大的操控性,易扩展性越来越受到web开发人员的喜爱,我在社区也发布了很多的jQuery插件,经常有人询问一些技巧,因此干脆写这么一篇 ...
- jquery 插件开发的作用域及基础
2019独角兽企业重金招聘Python工程师标准>>> 之前一直有开发jquery插件的冲动,所以一直想学习如何进行插件开发,最近一个项目需要使用图片上传组件及自动无限下拉组件,百度 ...
- Nutch插件开发及发布流程
2019独角兽企业重金招聘Python工程师标准>>> 一,插件开发流程: 1,Nutch开发客户端环境搭建 2,plugin的源代码则保存在/src/java/org/apach ...
- 深入理解 Mybatis 插件开发
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:风一样的码农 cnblogs.com/chenpi/p/10 ...
- 【直播回顾】蚂蚁金服高级开发工程师萧恺:IDEA 插件开发入门教程
主讲人:萧恺(蚂蚁金服-支付宝事业群-高级开发工程师) 本名:肖汉松 讲师介绍: 热爱阅读,喜欢挑战,热衷尝试新的技术,关注技术背后的原理. 关注领域:Java 服务端开发,分布式系统 关注语言:Ja ...
- 黄聪:《跟黄聪学WordPress插件开发》
续<跟黄聪学WordPress主题开发>之后,又一个作品完成!<跟黄聪学Wordpress插件开发>,国内最好的Wordpress插件开发视频教程!! 目录预览: WordPr ...
- discuz x3插件开发傻瓜图文教程,用demo说话
2019独角兽企业重金招聘Python工程师标准>>> 此demo功能是在模板footer部位插入一段javascript代码,这段代码可以是alert提示,也可以是加载广告等等. ...
- chrome 插件开发各种功能demo_Chrome 插件开发全攻略
Chrome 浏览器相信大家都用得比较多,有很多的优点,比如简洁.强大的开发者工具等,但是更让大家映像深刻的是有各种各样有趣.有用的插件,今天要给大家推荐的开源项目是 Chrome 插件开发全攻略,你 ...
- jQuery插件开发--(转)
1,开始 可以通过为jQuery.fn增加一个新的函数来编写jQuery插件.属性的名字就是你的插件的名字: jQuery.fn.myPlugin = function(){ //开始写你的代码吧! ...
最新文章
- java输出一个Int数据的补码
- jquery animate自定义动画
- Oracle绑定变量和审计功能影响性能吗?Python告诉你
- Android 系统(240)---底层如何简易的获取一个从AP传下来的parameter(flag)
- CIO感悟:IT人转型之“势、道、术”
- 怎样得到对方的电脑名_吸引力法则让他想念你,让对方主动找你
- yum安装wget失败,替换yum源为阿里yum源并重亲安装
- 一个简单的BitTorrent客户端实现(五):tracker manager和tracker实现
- 虚幻四蓝图实战(下车减速人物加速蓝图接口通信)
- 存储过程常用开关(set命令解析)
- 微信小程序聊天客服工具
- 来聊聊,今年各互联网大厂的年终奖......
- 2018-12-16【训练日记】
- Django知识点:认识Django
- SpringBoot返回的 JSON 带有斜杠 转义
- 插入 PNG 图片至 Excel
- (附源码)php校园二手交易网站 毕业设计041148
- Android V1签名与校验原理分析(全网最全最详细)
- 开发工具界面没了,但是后台进程还在跑,怎么找回来
- 变压器励磁电感以及漏感