服务getService()是当您的插件调用相应ComponentManager实例的方法时按需加载的插件组件(请参阅类型)。IntelliJ 平台确保仅加载一个服务实例,即使它被多次调用。
服务必须具有用于服务实例化的实现类。服务也可能有一个接口类,用于获取服务实例并提供服务的 API。
需要关闭挂钩/清理例程的服务可以实现Disposable并执行必要的工作dispose()(请参阅自动处置的对象)。
服务用于封装在一组相关类上操作的逻辑或提供一些可在插件项目中使用的可重用功能,并且在概念上与其他语言或框架中的服务类没有区别。
类型
IntelliJ 平台提供三种类型的服务:应用程序级服务(全局单例)、项目级服务和模块级服务。对于后两者,会为其对应范围的每个实例创建一个单独的服务实例,请参阅项目模型介绍。
请考虑不要使用模块级服务,因为它会增加具有许多模块的项目的内存使用量。
构造函数
项目/模块级别的服务构造函数可以有Project/Module参数。要提高启动性能,请避免在构造函数中进行任何繁重的初始化。
请注意,出于性能原因,不推荐使用构造函数注入(在Light Services中不支持)。仅在所有相应方法中需要时才应获取其他依赖项(请参阅项目服务示例)。someServiceMethod()
灯光服务
自 IntelliJ 平台 2019.3 起提供轻服务。
不会被覆盖的服务不需要在plugin.xml中注册(请参阅声明服务)。相反,使用@Service. 服务实例将根据调用者在范围内创建(请参阅检索服务)。
限制:
服务等级必须是final.
不支持构造函数注入(因为它已被弃用)。
如果服务是PersistentStateComponent,则必须禁用漫游 ( roamingType = RoamingType.DISABLED)。
有关示例,请参阅下面的项目级服务。
声明服务
要注册非Light Service,为每种类型提供了不同的扩展点:
com.intellij.applicationService- 应用级服务
com.intellij.projectService- 项目级服务
com.intellij.moduleService- 模块级服务(不推荐,见上文注)
要公开服务 API,请为其创建单独的类serviceInterface并在serviceImplementation. 如果serviceInterface未指定,它应该具有与 相同的值serviceImplementation。
要为测试/无头环境提供自定义实现,请另外指定testServiceImplementation/ headlessImplementation。
插件.xml
如果声明的服务打算由其他插件使用,具体取决于您的插件,请考虑将它们的源捆绑在插件分发中。
检索服务
获取服务不需要读取操作,可以从任何线程执行。如果从多个线程请求一个服务,它将在第一个线程中初始化,其他线程将被阻塞,直到服务完全初始化。
爪哇
科特林
MyApplicationService applicationService = ApplicationManager.getApplication()
.getService(MyApplicationService.class);
MyProjectService projectService = project.getService(MyProjectService.class);
getInstance()服务实现可以用方便的静态或方法包装这些调用getInstance(Project):
MyApplicationService applicationService = MyApplicationService.getInstance();
MyProjectService projectService = MyProjectService.getInstance(project);
获取服务流
项目服务样本
这个最小的示例显示了Light Service ProjectService与另一个项目级服务AnotherService(此处未显示)的交互。
项目服务.java
@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
}
}