原文链接:
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实例中获取。
每个组件都应该在配置文件中指定接口和实现类。 接口类用于从其它组件检索组件,实现类用于组件实例化。
注意:两个相同等级的组件(Application、Project或Module)不能有相同的接口类。接口和实现可以指定相同的类。
每个组件都有一个唯一的名称,用于其扩展和其它内部需要。 组件的名称可以使用它的getComponentName()
方法返回。
组件命名
推荐使用<plugin_name>.<component_name>
的方式命名组件。
应用级组件
应用级组件的实现类可以实现ApplicationComponent接口。
没有依赖的应用级组件应该有一个用来实例化的无参构造方法。如果一个应用级组件依赖于其它应用级组件,可以指定这些组件为构造方法的参数。IntelliJ平台 将确保组件以正确的顺序实例化满足依赖性。
注意:应用级组件必须在plugin.xml文件(查看插件配置文件)的
<application-components>
部分注册 。
快速创建应用级组件
IntelliJ平台 提供了创建应用级组件的简便方法。
IntelliJ平台接口会帮你声明应用级组件的实现类并自动对plugin.xml
文件的<application-components>
部分进行适当的修改。
创建并注册应用级组件
- 在你的项目中,在目标包的上下文菜单上点击新建或按
Alt + Insert
。 - 在新建菜单上点击应用级组件.
- 在打开的新建应用级组件对话框中输入应用级组件的名称然后点击确定。
IntelliJ平台 会生成一个实现ApplicationComponent接口的Java类。首先在plugin.xml
文件注册新建的组件,然后新建类文件并在编辑器中打开新建的组件类。
项目级组件
项目级组件的实现类可以实现ProjectComponent接口。
如果项目级组件需要项目实例,它的构造方法可以传入Project类型的参数。如果它依赖其它组件也可以传入其它应用级组件或项目级组件作为参数。
注意:项目级组件必须在plugin.xml文件(查看插件配置文件)的
<project-components>
部分注册 。
快速创建项目级组件
IntelliJ平台 提供了创建项目级组件的简便方法。
IntelliJ平台接口会帮你声明项目级组件的实现类并自动对plugin.xml
文件的<project-components>
部分进行适当的修改。
创建并注册项目级组件
- 在你的项目中,在目标包的上下文菜单上点击新建或按
Alt + Insert
。 - 在新建菜单上点击项目级组件.
- 在打开的新建项目级组件对话框中输入项目级组件的名称然后点击确定。
IntelliJ平台 会生成一个实现ProjectComponent接口的Java类。首先在plugin.xml
文件注册新建的组件,然后新建类文件并在编辑器中打开新建的组件类。
模块级组件
模块级组件的实现类可以实现ModuleComponent接口。
如果模块级组件需要模块实例,它的构造方法可以传入Module类型的参数。如果它依赖其它组件也可以传入其它应用级组件、项目级组件或模块级组件作为参数。
注意:项目级组件必须在plugin.xml文件(查看插件配置文件)的
<module-components>
部分注册 。
快速创建模块级组件
IntelliJ平台 提供了创建模块级组件的简便方法。
IntelliJ平台接口会帮你声明模块级组件的实现类并自动对plugin.xml
文件的<module-components>
部分进行适当的修改。
创建并注册模块级组件
- 在你的项目中,在目标包的上下文菜单上点击新建或按
Alt + Insert
。 - 在新建菜单上点击模块级组件.
- 在打开的新建模块级组件对话框中输入模块级组件的名称然后点击确定。
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
方法中访问它们。