IntelliJ平台提供了服务的概念。
当调用ServiceManager的getService
时,服务会按需加载到插件中。
IntelliJ平台会保证多次服务加载得到的服务都是单例对象。服务必须有一个实现类用于初始化。可以通过服务接口来对外提供API和获取服务实例。服务的实现类和接口都在plugin.xml
进行配置。
IntelliJ平台提供了三种类型的服务:应用级别服务、项目级别服务以及模块级别服务。
如何声明一个服务?
可以使用如下IDEA核心扩展点来声明服务:
applicationService
:用于声明应用级别服务。projectService
:用于声明项目级别服务。moduleService
:用于声明模块级别服务。
声明服务:
- 在
plugin.xml
的<extensions>
部分添加对应的子标签(<applicationService>
、<projectService>
或<moduleService>
) - 为新增的子标签设置如下属性:
serviceInterface
:指定服务的接口。serviceImplementation
:指定服务的实现类。
如果没有指定serviceInterface
,则会假定其和serviceImplementation
具有一样的值。
对于服务声明,参见如下示例,
<extensions defaultExtensionNs="com.intellij">
<!-- Declare the application level service -->
<applicationService serviceInterface="Mypackage.MyApplicationService" serviceImplementation="Mypackage.MyApplicationServiceImpl" />
<!-- Declare the project level service -->
<projectService serviceInterface="Mypackage.MyProjectService" serviceImplementation="Mypackage.MyProjectServiceImpl" />
</extensions>
获取服务实例
在Java代码中,使用如下方式进行服务实例化:
MyApplicationService applicationService = ServiceManager.getService(MyApplicationService.class);
MyProjectService projectService = ServiceManager.getService(project, MyProjectService.class);
MyModuleService moduleService = ModuleServiceManager.getService(module, MyModuleService.class);
示例插件
本章节通过下载并安装示例插件来说明如何创建和使用插件服务。该插件有一个用于计数当前IDE中打开的项目个数的项目级别服务。如果打开的项目个数达到插件允许的最大个数,则插件会返回一个异常信息并关闭最近打开最多的项目。
安装运行示例插件