服务

走着路睡觉大约 3 分钟

服务

调用对应的 ComponentManager.getService()open in new window 方法可以获取到Service,获取到的Service是单例的

Service必须有实现类,也有可能有接口

如果Service对象需要清理一些东西,Service需要实现 Disposable.dispose()open in new window 接口,了解更多可查看 自动回收对象文档

Service主要用来封装一些操作方便重用

Service类型

IntelliJ Platform根据作用域不同提供了3种类型Service:

  • application-level services (global singleton), 应用级的,是单例的
  • project-level services, 项目级的
  • module-level services ,module级的

project-level和module-level 在不同的作用域内会创建不同的实例,了解详情可看 项目结构文档

提示

尽量不要使用 module-level的Service,因为IntelliJ Platform会为每个module创建一个Service,占用更多内存

构造器(Constructor)

project-level 的Service的构造器需要有一个参数 Project, module-level 的Service的构造器需要有一个参数 Module,为了提高启动性能,尽量不要在构造器中执行太多操作

提示

为了提高性能,不推荐直接在构造器中注入Service,这种方式后期会放弃掉,轻服务(Light Services)更是不支持,所有的Service应该都是需要的时候再加载,具体可看 Project-Level Service 示例代码

轻服务(Light Services)

提示

IntelliJ Platform 2019.3 以后的版本才支持轻服务

不需要重写的Service不需要在plugin.xml里注册 ,只需要加上注解 @Serviceopen in new window , 在 获取Service 的时候,会自动创建它

轻服务有一些限制:

Project-Level Service 示例代码

注册Service

注册普通服务(不是轻服务)提供了3个扩展点:

  • com.intellij.applicationService - application-level service

  • com.intellij.projectService - project-level service

  • com.intellij.moduleService - module-level service (不推荐,消耗内存)

声明一个Service,需要指定 serviceInterface 和serviceImplementation ,如果不指定serviceInterface,那么serviceImplementation需要和接口的名称一致

<extensions defaultExtensionNs="com.intellij">
  <!-- 注册 application-level service -->
  <applicationService
      serviceInterface="mypackage.MyApplicationService"
      serviceImplementation="mypackage.MyApplicationServiceImpl"/>

  <!-- 注册 project-level service -->
  <projectService
      serviceInterface="mypackage.MyProjectService"
      serviceImplementation="mypackage.MyProjectServiceImpl"/>
</extensions>

获取Service

获取Service可以在任意线程执行,如果同时在多个线程内获取Service,在第一个线程将Service初始化完成之前,其它线程处理阻塞状态

// 获取 application-level service
MyApplicationService applicationService = ApplicationManager.getApplication()
  .getService(MyApplicationService.class);

//获取 project-level service
MyProjectService projectService = project.getService(MyProjectService.class);

获取Service流程如下

Project-Level Service 示例代码

展示了轻服务(Light Service)Project-Level Service的代码


@Service
public final class ProjectService {

  private final Project myProject;

  public ProjectService(Project project) {
    myProject = project;
  }

  public void someServiceMethod(String parameter) {
    AnotherService anotherService = myProject.getService(AnotherService.class);
    String result = anotherService.anotherServiceMethod(parameter, false);
    // do some more stuff
  }
}

插件示例

maxOpenProjectsopen in new window 该示例代码里展示了如何使用Service

这个插件可以统计当前打开的项目数量,如果当前打开的项目数超过了3个,会提示warning消息

上次编辑于:
贡献者: zhaojingbo
Loading...