コマンド登録

コマンドを定義するには、アノテーションモデルを使用する方法とプログラムモデルを使用する方法の 2 つがあります。

  • アノテーションモデルでは、@Component クラス内のメソッドと、特定のアノテーションを持つメソッドを定義します。

  • プログラムモデルでは、より低レベルのアプローチを使用して、コマンドを Bean として定義します。

アノテーションベースの登録

@Command アノテーションは、メソッドをコマンド登録の候補としてマークします。以下の例では、コマンド example が定義されています。

class Example1 {

	@Command(name = "example")
	public String example() {
		return "Hello";
	}

}
コマンド名はオプションです。指定されていない場合は、メソッド名がコマンド名として使用されます。コマンドが値を返す場合、その値はシェル出力に表示されます。

@Command を使用してもコマンドターゲットは自動的に登録されません。代わりに @EnableCommand アノテーションを使用する必要があります。このモデルは Spring 傘下の他の部分でもよく知られており、コマンドターゲットを排他的ではなく包括的に扱うことができるため、ユーザーにとってより柔軟性が高まります。

@EnableCommand を使用してターゲットクラスを定義できます。すべての構成クラスから選択されます。

@EnableCommand({ Example1.class, Example2.class })
class App {

}
Spring Boot アプリケーションでは @EnableCommand は必要ありません。Spring Boot の自動構成によってそれが処理されます。

プログラムによる登録

プログラムモデルでは、コマンドは Command 型の Bean として定義できます。

@Bean
Command myCommand() {
	return Command.builder().name("mycommand").execute(context -> {
		context.outputWriter().println("This is my command!");
	});
}

AbstractCommand クラスを使用してコマンド定義を簡素化することもできます。

@Bean
Command myCommand() {
	return new AbstractCommand("mycommand", "This is my command") {
		@Override
		public ExitStatus doExecute(CommandContext commandContext) {
			println("This is my command!", commandContext);
			return ExitStatus.OK;
		}
	};
}

AbstractCommand は、ヘルプオプション (-h および --help) の処理やシェル出力へのメッセージの出力など、コマンドの作成を簡素化するユーティリティメソッドをいくつか提供します。

コマンドレジストリ

CommandRegistry インターフェースは、シェルアプリケーションが認識するコマンドセットを保持します。コマンドは動的に登録および登録解除できます。

デフォルトでは、Spring Shell はアプリケーションコンテキストで定義されたコマンドを CommandRegistry に入力します。