idea freemarker插件_IDEA 插件开发实战

一. 简介

IntelliJ IDEA 是一款开发工具,提供很多插件功能,比如阿里规范插件(Alibaba Java Coding Guidelines),但是随着日常业务展开,很多工作重复性编码,浪费很多时间,需要自定义抽象出来一些插件,自动化的方式解决问题,这也是工程师文化的体现。

二.原理

2.1 背景

IntelliJ 平台是开源的,基于 Apache 许可协议,提供很多丰富的工具,提供组件驱动,基于跨平台 JVM,可以在创建菜单栏、列表、弹出菜单、对话框等等。可以适用于多种语言,提供相关解析器和 PSI 模型,解析文件,构建语义模型。

2.2 基本原理

组件模型

负责生命周期管理以及连接组件之间的相互依赖关系。

  • Application level components,在 IDEA 启动的时候创建和初始化,可以使用 getComponent(Class) 获取它们。
  • Project level components,在 IDEA 中每个 Project 实例创建的,甚至可以为未打开的项目创建组件,可以使用 getComponent(Class)方法从 Project 实例中获取它们。
  • Module level components,它们是为 IDEA 中加载的每个项目中每个模块创建,使用 getComponent(Class)方法可以从 Module 实例获取模块级别组件。

生命周期:

  • 创建,调用构造函数
  • 初始化,initComponent 调用该方法(如果组件实现 ApplicationComponent 接口)
  • 配置,保存和加载每个组件的状态。(PersistentStateComponent 和 JDOMExternalizable,实例化配置)。
  • 注册,对于模块组件,将调用接口的 moduleAdded 方法 ModuleComponent 将模块添加到项目中,对于项目组件,调用接口的 projectOpened 方法 ProjectComponent 加载项目。
  • 保存配置,JDOMExternalizable,PersistentStateComponent 的调用。
  • 输出,disposeComponent 调用输出。

线程模型

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

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

后台流程管理

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

讯息传递

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

2.3 小结

具体相关原理研究,可查看官网(sdk 地址)。

三.API

3.1 框架结构

.IntelliJIDEA/└──  plugins    └── code_plugin        └── lib            ├── lib_foo.jar            ├── lib_bar.jar            │   ...            │   ...            └── sample.jar                ├── com/foo/...                │   ...                │   ...                └── META-INF                    ├── plugin.xml                    ├── pluginIcon.svg                    └── pluginIcon_dark.svg└──src├──com.code

基本的框架结构,如果要导入依赖放到 lib 文件夹中,还有另一种建立框架的方式,那个是基于 Gradle 管理。

META-INF,配置文件件,管理注册的类。

3.2 常用 API 介绍

VFS

  • 提供一个处理文件的通用 API,而不关心文件的具体位置(无论文件位于磁盘上、归档文件中还是 HTTP 服务器上)。
  • 追踪文件变化,并且在检测到文件内容发生更改时能提供新旧两个版本的文件。
  • 建立文件在 VFS 和持久化存储之间的关联。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值