IntelliJ Platform SDK DevGuide

Edit page

Plugin Components

组件是插件集成的基本概念. 有三种组件:

  • 在IDE启动时创建并初始化应用程序级组件. 可以使用getComponent(Class)方法从Application实例中获取它们.

  • 为IDE中的每个Project实例创建项目级组件. (请注意,即使未打开的项目也可以创建组件.)可以使用getComponent(Class)方法从Project实例获取它们.

  • 在IDE中加载的每个项目中为每个Module创建模块级组件 .

可以使用getComponent(Class)方法从Module实例获取模块级组件.

每个组件都应该具有配置文件中指定的接口和实现类. 接口类将用于从其他组件检索组件,实现类将用于组件实例化.

注意同一级别的两个组件(Application,ProjectModule)不能 具有相同的接口类. 可以为接口和实现指定相同的类.

每个组件都有一个唯一的名称,用于其外部化和其他内部需求. 组件的名称由其getComponentName()方法返回.

##组件命名表示法

建议以“.”的形式命名组件.

##应用程序级组件

可选地,应用程序级组件的实现类可以实现ApplicationComponent接口.

没有依赖项的应用程序组件应该有一个没有参数的构造函数,它将用于实例化. 如果应用程序组件依赖于其他应用程序组件,则它可以将这些组件指定为构造函数参数.

  • IntelliJ Platform *将确保以正确的顺序实例化组件以满足依赖性.

应用程序级组件必须在plugin.xml文件的<application-components>部分中注册(请参阅插件配置文件).

##项目级组件

可选地,项目级组件的实现类可以实现ProjectComponent接口.

如果需要项目实例,项目级组件的构造函数可以具有Project类型的参数. . 如果依赖于这些组件,它还可以将其他应用程序级或项目级组件指定为参数.

项目级组件必须在plugin.xml文件的<project-components>部分中注册(参见Plugin Configuration File).

##模块级组件

可选地,模块级组件的实现类可以实现ModuleComponent接口.

如果需要模块实例,则模块级组件的构造函数可以具有Module类型的参数. 如果它依赖于那些组件,它还可以将其他应用程序级别,项目级别或模块级别组件指定为参数.

模块级组件必须在plugin.xml文件的<module-components>部分中注册(参见Plugin Configuration File).

##持久化组件的状态

如果组件的类实现JDOMExternalizable(不建议使用)或[PersistentStateComponent],则会自动保存和加载每个组件的状态. ](upsource:///platform/projectModel-api/src/com/intellij/openapi/components/PersistentStateComponent.java)界面.

当组件的类实现PersistentStateComponent接口时,组件状态将保存在您可以指定的XML文件中 使用@State@StorageJava代码中的注释.

当组件的类实现JDOMExternalizable接口时,组件将其状态保存在以下文件中:

*项目级组件将其状态保存到项目(.ipr)文件中.      但是,如果plugin.xml文件中的workspace选项设置为true,则组件将其配置保存到工作空间(.iws)文件中.

*模块级组件将其状态保存到模块(.iml)文件中.

有关更多信息和示例,请参阅持久性组件状态.

##默认值

默认值(组件的预定义设置)应放在<component_name> .xml文件中. 将此文件放在与默认包对应的文件夹中的插件的类路径中. readExternal()方法将在<component>root标签上调用.

如果组件有默认值,则会调用readExternal()方法两次:

*第一次默认

*第二次保存配置

##插件组件生命周期

组件按以下顺序加载:

  • Creation - 调用构造函数.

*初始化 - 调用initComponent方法(如果组件实现ApplicationComponent接口).

*配置 - 调用readExternal方法(如果组件实现JDOMExternalizable接口)或loadState 调用方法(如果组件实现PersistentStateComponent并且具有非默认持久化状态).

*对于模块组件,调用[ModuleComponent]的“moduleAdded”方法(upsource:///platform/projectModel-api/src/com/intellij/openapi/module/ModuleComponent.java)接口以通知模块具有 已添加到项目中.

*对于项目组件,调用ProjectComponent接口的projectOpened方法来通知项目有 已装载.

按以下顺序卸载组件:

*保存配置 - 调用writeExternal方法(如果组件实现JDOMExternalizable接口),或者 调用getState方法(如果组件实现PersistentStateComponent).

  • Disposal - 调用disposeComponent方法.

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

Last modified: 9 May 2019