命令目录

CommandCatalog 接口定义了命令注册如何在 Shell 应用程序中存在。可以动态注册和注销命令,这为命令可能出现和消失的使用场景提供了灵活性,具体取决于 Shell 的状态。请考虑以下示例

CommandRegistration registration = CommandRegistration.builder().build();
catalog.register(registration);

命令解析器

您可以实现 CommandResolver 接口并定义一个 Bean 来动态解析从命令名称到其 CommandRegistration 实例的映射。请考虑以下示例

static class CustomCommandResolver implements CommandResolver {
	List<CommandRegistration> registrations = new ArrayList<>();

	CustomCommandResolver() {
		CommandRegistration resolved = CommandRegistration.builder()
			.command("resolve command")
			.build();
		registrations.add(resolved);
	}

	@Override
	public List<CommandRegistration> resolve() {
		return registrations;
	}
}
CommandResolver 的当前限制在于每次解析命令时都会使用它。因此,如果命令解析调用需要很长时间,我们建议不要使用它,因为它会使 Shell 运行缓慢。

命令目录自定义器

您可以使用 CommandCatalogCustomizer 接口来自定义 CommandCatalog。其主要用途是修改目录。此外,在 spring-shell 自动配置中,此接口用于将现有的 CommandRegistration Bean 注册到目录中。请考虑以下示例

static class CustomCommandCatalogCustomizer implements CommandCatalogCustomizer {

	@Override
	public void customize(CommandCatalog commandCatalog) {
		CommandRegistration registration = CommandRegistration.builder()
			.command("resolve command")
			.build();
		commandCatalog.register(registration);
	}
}

您可以创建一个 CommandCatalogCustomizer 作为 Bean,Spring Shell 会处理其余操作。