插件组件

原文链接:
http://www.jetbrains.org/intellij/sdk/docs/basics/plugin_structure/plugin_components.html

组件是插件集成的基本概念。有三种类型的组件:

  • 应用级组件在IDE启动时被创建和初始化. 它们可以通过getComponent(Class)方法从Application实例中获取。
  • 项目级组件为每个IDE中的Project实例创建。(请注意即使项目未打开,组件也可能被创建)它们可以通过getComponent(Class)方法从Project实例中获取。
  • 模块级组件为加载进IDE的项目的每个Module实例创建。它们可以通过getComponent(Class)方法从Module实例中获取。

每个组件都应该在配置文件中指定接口和实现类。 接口类用于从其它组件检索组件,实现类用于组件实例化。

注意:两个相同等级的组件(ApplicationProjectModule)不能有相同的接口类。接口和实现可以指定相同的类。

每个组件都有一个唯一的名称,用于其扩展和其它内部需要。 组件的名称可以使用它的getComponentName()方法返回。

组件命名

推荐使用<plugin_name>.<component_name>的方式命名组件。

应用级组件

应用级组件的实现类可以实现ApplicationComponent接口。

没有依赖的应用级组件应该有一个用来实例化的无参构造方法。如果一个应用级组件依赖于其它应用级组件,可以指定这些组件为构造方法的参数。IntelliJ平台 将确保组件以正确的顺序实例化满足依赖性。

注意:应用级组件必须在plugin.xml文件(查看插件配置文件)的<application-components>部分注册 。

快速创建应用级组件

IntelliJ平台 提供了创建应用级组件的简便方法。

IntelliJ平台接口会帮你声明应用级组件的实现类并自动对plugin.xml文件的<application-components>部分进行适当的修改。

创建并注册应用级组件

  1. 在你的项目中,在目标包的上下文菜单上点击新建或按Alt + Insert
  2. 新建菜单上点击应用级组件.
  3. 在打开的新建应用级组件对话框中输入应用级组件的名称然后点击确定

IntelliJ平台 会生成一个实现ApplicationComponent接口的Java类。首先在plugin.xml文件注册新建的组件,然后新建类文件并在编辑器中打开新建的组件类。

项目级组件

项目级组件的实现类可以实现ProjectComponent接口。

如果项目级组件需要项目实例,它的构造方法可以传入Project类型的参数。如果它依赖其它组件也可以传入其它应用级组件或项目级组件作为参数。

注意:项目级组件必须在plugin.xml文件(查看插件配置文件)的<project-components>部分注册 。

快速创建项目级组件

IntelliJ平台 提供了创建项目级组件的简便方法。

IntelliJ平台接口会帮你声明项目级组件的实现类并自动对plugin.xml文件的<project-components>部分进行适当的修改。

创建并注册项目级组件

  1. 在你的项目中,在目标包的上下文菜单上点击新建或按Alt + Insert
  2. 新建菜单上点击项目级组件.
  3. 在打开的新建项目级组件对话框中输入项目级组件的名称然后点击确定

IntelliJ平台 会生成一个实现ProjectComponent接口的Java类。首先在plugin.xml文件注册新建的组件,然后新建类文件并在编辑器中打开新建的组件类。

模块级组件

模块级组件的实现类可以实现ModuleComponent接口。

如果模块级组件需要模块实例,它的构造方法可以传入Module类型的参数。如果它依赖其它组件也可以传入其它应用级组件、项目级组件或模块级组件作为参数。

注意:项目级组件必须在plugin.xml文件(查看插件配置文件)的<module-components>部分注册 。

快速创建模块级组件

IntelliJ平台 提供了创建模块级组件的简便方法。

IntelliJ平台接口会帮你声明模块级组件的实现类并自动对plugin.xml文件的<module-components>部分进行适当的修改。

创建并注册模块级组件

  1. 在你的项目中,在目标包的上下文菜单上点击新建或按Alt + Insert
  2. 新建菜单上点击模块级组件.
  3. 在打开的新建模块级组件对话框中输入模块级组件的名称然后点击确定

IntelliJ平台 会生成一个实现ModuleComponent接口的Java类。首先在plugin.xml文件注册新建的组件,然后新建类文件并在编辑器中打开新建的组件类。

持久化组件状态

如果组件类实现了JDOMExternalizable接口(不推荐使用)或PersistentStateComponent接口,那么每个组件的状态都会被自动保存和加载。

当组件类实现了PersistentStateComponent接口,组件的状态会保存在一个XML文件中,你可以在Java代码中使用@State@Storage注解指定文件位置。

当组件类实现了JDOMExternalizable接口,组件会见它们的状态保存到以下的文件:

  • 项目级组件的状态保存在.ipr文件

    但是如果plugin.xml文件中的workspace选项设置为true,组件会将它的状态保存到.iws文件。

  • 模块级组件的状态保存在.iml文件。

更多信息和示例参阅持久化组件状态

默认配置

组件的默认配置应该放到<component_name>.xml文件中。将此文件放在插件的classpath文件夹,相当于默认包的文件夹。readExternal()方法将会调用它。

如果组件有默认配置,readExternal()方法会被调用两次:

  • 第一次获取默认配置
  • 第二次获取保存的配置

插件组件的生命周期

组件的加载顺序:

  • 创建 - 构造方法被调用;
  • 初始化 - initComponent 方法被调用 (如果组件实现了ApplicationComponent接口);
  • 配置 - readExternal 方法被调用(如果组件实现了JDOMExternalizable 接口)或者loadState方法被调用(如果组件实现了PersistentStateComponent接口且没有默认的持久化状态);
  • 对于模块级组件,ModuleComponent接口的moduleAdded方法被调用来通知模块已经添加到项目中;
  • 对于项目级组件,ProjectComponent接口的projectOpened方法被调用来通知项目已被加载。

组件卸载顺序:

  • 保存配置 - writeExternal方法被调用(如果组件实现了JDOMExternalizable接口)或getState 方法被调用(如果组件实现了PersistentStateComponent接口);
  • 清理 - disposeComponent方法被调用。

注意:你不应该在构造方法中使用getComponent()方法请求任何其它组件,否则你将得到一个断言。如果你需要在初始化组件时访问其它组件,你可以将其作为构造方法的参数或在initComponent方法中访问它们。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,754评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,629评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,773评论 6 342
  • 夜深了,但其实也不过半夜十一二点而已。十一二点对现在的大部分人而言,好像都算不上夜深了,好像都习惯熬夜了。 还记得...
    呙子阅读 189评论 0 0
  • 谨以此文,献给天下已经远行的父亲。 你们在比远方更远的地方,是否依然安好…… 又是父亲节,总有一些孩子如...
    借山居五蕴寻物造物阅读 484评论 0 1