IntelliJ插件开发 - PersistentStateComponent

简介

PersistentStateComponent是idea给插件开发者提供的接口,用于存储插件的配置。实现该接口后,idea会将配置持久化成文件存储到磁盘中,idea关闭或者插件卸载都不会导致配置丢失。

使用方法

  1. 定义配置类,只有public属性、bean properties(get方法)、或带有注解的私有字段才会被序列化。带有默认值的序列化字段仅仅当他们的值被改变成和默认值不一样的时候才会被序列化。
public class ApplicationState {

	@OptionTag("可以修改持久化的tag标签,不填则与fieldName保持一致")
	public String pluginName;
	// Set序列化成String时,可以用@XCollection注解
	@XCollection(style = XCollection.Style.v2, propertyElementName = "blacklistUsers", elementTypes = {String.class})
    private final Set<String> blacklistUsers = new HashSet<>();
}
  1. 实现PersistentStateComponent接口,指明持久化的文件名。windows平台下文件的存储路径为:%USERPROFILE%\AppData\Roaming\JetBrains\IdeaIC2023.2\options\my-plugin-settings.xml
@State(name = "my-plugin-settings", storages = {@Storage("my-plugin-settings.xml")})
public class ApplicationSettings implements PersistentStateComponent<ApplicationState> {

	private ApplicationState state;

	// 可选:提供static获取自身的方法,方便调用
	public static ChatxApplicationState settings() {
        return ApplicationManager.getApplication().getService(ApplicationSettings.class).getState();
    }

	// 返回配置类,如果你的配置类都是默认值没被改变过,则没有被序列化,这里会返回null。
	@Override
    public @Nullable ApplicationState getState() {
        return state;
    }
	
	// IDE从序列化文件装载成对象的时候会调用此方法,可能会被调用多次(文件在外部被改变了)
	@Override
    public void loadState(@NotNull ApplicationState state) {
        this.state = state;
    }
    
    // 当配置没变更过时,不会有序列化文件,loadState不会被调用,为了获取配置的默认值,需要重写该方法
	@Override
    public void noStateLoaded() {
        this.state = new ChatxApplicationState();
    }
	
}
  1. 注册服务
<idea-plugin>
	<extensions defaultExtensionNs="com.intellij">
		<applicationService serviceImplementation="com.demo.ApplicationSettings"/>
	extensions>
idea-plugin>
  1. 调用

可以直接修改或获取PersistentStateComponent接口实现类的属性,序列化和反序列化动作由idea完成。修改操作需要在UI线程中执行,以确保与IDE 的其他组件正确交互

// 获取配置
String pluginName = ApplicationSettings.settings().pluginName;
// 修改配置
ApplicationManager.getApplication().invokeLater(() -> {
	ApplicationSettings.settings().pluginName = "修改后的值";
});

存储敏感数据

// 敏感数据的key,必须为CredentialAttributes对象
private CredentialAttributes createCredentialAttributes(String key) {
  return new CredentialAttributes(
    CredentialAttributesKt.generateServiceName("MySystem", key)
  );
}

// 存储敏感数据
CredentialAttributes attributes = createCredentialAttributes(key);
Credentials credentials = new Credentials(username, password);
PasswordSafe.getInstance().set(attributes, credentials);

//获取敏感数据
Credentials credentials = PasswordSafe.getInstance().get(attributes);

参考文献

持久化组件状态
持久化敏感数据

你可能感兴趣的:(#,Intellij插件,intellij,idea)