组件是插件组成的基本单位。有如下三种类型组件:

  • 应用级别组件:随IDE启动而创建和初始化。可以从Application实例中通过getComponent(Class)获取。
  • 项目级别组件:会为IDE中不同的Project创建对应的组件实例。可使用Project实例的getComponent(Class)方法获取。
  • 模块级别组件 :会为项目中不同 Module创建对应的组件实例。可通过Module实例的getComponent(Class)来获取。

在配置文件中,应为每个组件配置接口和实现类。接口类用于从其他组件获取当前组件使用,实现类则用于实例化当前组件。 注意:对于相同级别的两个组件(应用级别, 项目级别模块级别)不能使用同一个接口类。否则这两个组件会使用同一个接口和实现类。

组件名字为getComponentName()返回的字符,其具有唯一性,并用于外部扩展或者内部使用。

组件命名规范

推荐使用插件名.组件名规范进行组件命名。

应用级别组件

应用级别组件实现类推荐实现ApplicationComponent 接口。

如果一个应用级别组件没有任何依赖,则其应该有一个无参构造函数,用于组件初始化。如果依赖其他组件,则可以在构造函数的参数中指定需要依赖组件。IntelliJ平台会保证组件以正确的顺序进行初始化,来实现组件的依赖关系。

应用级别组件必须在plugin.xml中的<application-components>部分进行注册(参见:插件配置)。

快速创建应用级别组件

IntelliJ平台提供了简单的创建应用组件的方式,而无需关心底层基础结构。

IntelliJ平台会帮助定义组件实现类并自动在plugin.xml中的 <application-components>部分进行注册。

创建并注册应用级别组件:

  1. 在项目中需要创建应用实现类的包上右键点击,并选择New(或者使用快捷键:Alt+Insert)。
  2. New的子菜单中,点击Application Component
  3. New Application Component对话框中,输入组件名字并点击OK

IntelliJ平台会生成一个实现于接口ApplicationComponent的类。并在plugin.xml中进行注册,接着刷新模块视图,在编辑器中打开该类。

项目级别组件

项目级别的组件推荐实现ProjectComponent接口。

项目级别组件可以通过构造入参获得项目实例引用。也可以通过构造入参依赖其他应用级别或项目级别组件。

注意:项目级别组件必须在plugin.xml中的<project-components>部分进行配置(参见:插件配置文件)。

快速创建项目级别组件

IntelliJ平台提供了简单的创建项目组件的方式,而无需关心底层基础结构。

IDEA界面会帮助定义组件实现类并自动在plugin.xml中的 <<project-components>>部分进行注册。

创建并注册项目级别组件

  1. 在项目中,需要创建组件的包上点击右键,然后在弹出菜单点击New (或者使用快捷键 Alt+Insert)。
  2. New子菜单,点击Project Component
  3. New Project Component 对话框,输入组件名称,然后点击OK

IntelliJ平台会生成一个实现于接口ProjectComponent 的类。并在plugin.xml中进行注册,接着刷新模块视图,在编辑器中打开该类。

模块级别组件

模块级别的组件推荐实现ModuleComponent接口。

模块级别组件可以通过构造入参获得模块实例引用。也可以通过构造入参依赖其他应用级别、项目级别或模块级别组件。

注意:项目级别组件必须在plugin.xml中的<module-components>部分进行配置(参见:插件配置文件)。

快速创建模块级别组件

IntelliJ平台提供了简单的创建项目组件的方式,而无需关心底层基础结构。

IDEA界面会帮助定义组件实现类并自动在plugin.xml中的 <module-components>部分进行注册。

创建并注册项目级别组件

  1. 在项目中,需要创建组件的包上点击右键,然后在弹出菜单点击New (或者使用快捷键 Alt+Insert)。
  2. New子菜单,点击Module Component
  3. New Module Component 对话框,输入组件名称,然后点击OK

IntelliJ平台会生成一个实现于接口ModuleComponent 的类。并在plugin.xml中进行注册,接着刷新模块视图,在编辑器中打开该类。

保存组件状态

如果组件实现了JDOMExternalizable (过时)或PersistentStateComponent接口,那么其状态都会自动保存和加载。

当组件实现了 PersistentStateComponent 接口,用@State@Storage 标示的状态会会存储到xml文件中。

当组件实现JDOMExternalizable接口,组件会将状态存储到如下文件中:

  • 项目级别的组件存储到项目文件中(.ipr文件)。

    然而,如果在plugin.xml中将组件的workspace选项置为ture,则该组件的配置信息存储到工作区间文件(.iws)中。

  • 模块级别的组件存储组件状态到模块文件(.iws)中。

更多的信息和示例,参见持久化组件状态

默认值

组件的默认值(预定义的配置)会存放在<component_name>.xml中。将该配置文件放到插件的classpath下的默认包路径文件夹中。当解析配置中的<component>标签时会调用readExternal()方法。

当组件有默认值时,readExternal()方法会调用两次:

  • 第一次加载默认值
  • 第二次加载存储的配置

插件组件生命周期

组件按照如下顺序进行加载:

  • 创建 - 调用构造方法
  • 初始化 - 如果组件实现ApplicationComponent接口,则调用initComponent方法
  • 配置 - 如果组件实现JDOMExternalizable接口,则调用其readExternal方法;如果组件实现PersistentStateComponent接口,则调用loadState方法,此方式下组件没有默认值。
  • 对于模块级别组件,基于接口 ModuleComponent 的组件,会调用其moduleAdded方法,用于通知模块已经添加到了项目中。
  • 对于项目级别组件,基于接口ProjectComponent的组件,会调用projectOpened来触发项目加载完成事件。

组件按照如下顺序进行卸载:

  • 保存配置 - 如果组件实现了JDOMExternalizable接口,则调用组件的writeExternal方法;如果实现PersistentStateComponent接口,则调用其getState方法。
  • 清理 - 调用组件的disposeComponent方法

注意:不应该再组件的构造方法中使用getComponent来依赖其他组件,否则会得到一个异常断言。如果需要在组件初始化时,依赖其他组件,则可以通过构造函数参数或者在initComponent中访问其他组件。

results matching ""

    No results matching ""