クラス CommandLinePropertySource<T>

型パラメーター:
T - ソース型
既知の直属サブクラス
JOptCommandLinePropertySourceSimpleCommandLinePropertySource

public abstract class CommandLinePropertySource<T> extends EnumerablePropertySource<T>
コマンドライン引数によってサポートされる PropertySource 実装の抽象基本クラス。パラメーター化された型 T は、コマンドラインオプションの基礎となるソースを表します。たとえば、SimpleCommandLinePropertySource は String 配列を使用します。

目的と一般的な使用箇所

スタンドアロンの Spring ベースのアプリケーション、つまりコマンドラインから引数の String[] を受け入れる従来の main メソッドを介してブートストラップされるアプリケーションで使用するため。多くの場合、main メソッド内で直接コマンドライン引数を処理することで十分ですが、他の場合では、引数を値として Spring Bean に挿入することが望ましい場合があります。CommandLinePropertySource が役立つのは、後者の場合です。CommandLinePropertySource は通常、Spring ApplicationContextEnvironment に追加されます。この時点で、すべてのコマンドライン引数が PropertyResolver.getProperty(String) ファミリのメソッドを通じて使用可能になります。例:
 public static void main(String[] args) {
     CommandLinePropertySource clps = ...;
     AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
     ctx.getEnvironment().getPropertySources().addFirst(clps);
     ctx.register(AppConfig.class);
     ctx.refresh();
 }
上記のブートストラップロジックを使用すると、AppConfig クラスは Spring Environment を @Inject し、プロパティを直接照会できます。
 @Configuration
 public class AppConfig {

     @Inject Environment env;

     @Bean
     public void DataSource dataSource() {
         MyVendorDataSource dataSource = new MyVendorDataSource();
         dataSource.setHostname(env.getProperty("db.hostname", "localhost"));
         dataSource.setUsername(env.getRequiredProperty("db.username"));
         dataSource.setPassword(env.getRequiredProperty("db.password"));
         // ...
         return dataSource;
     }
 }
CommandLinePropertySource は #addFirst メソッドを使用して EnvironmentMutablePropertySources のセットに追加されたため、検索の優先順位が最も高くなります。つまり、"db.hostname" およびその他のプロパティは、システム環境変数などの他のプロパティソースに存在する可能性がありますが、最初にコマンドラインプロパティソース。コマンドラインで指定された引数が環境変数として指定された引数よりも当然より具体的であることを考えると、これは合理的なアプローチです。

Environment を注入する代わりに、Spring の @Value アノテーションを使用して、直接または <context:property-placeholder> 要素を使用して PropertySourcesPropertyResolver Bean が登録されている場合に、これらのプロパティを注入できます。例:

 @Component
 public class MyComponent {

     @Value("my.property:defaultVal")
     private String myProperty;

     public void getMyProperty() {
         return this.myProperty;
     }

     // ...
 }

オプション引数の使用

個々のコマンドライン引数は、通常の PropertySource.getProperty(String) および PropertySource.containsProperty(String) メソッドを通じてプロパティとして表されます。例: 次のコマンドラインを指定します。

--o1=v1 --o2
"o1" と "o2" は「オプション引数」として扱われ、次のアサーションは true と評価されます。
 CommandLinePropertySource<?> ps = ...
 assert ps.containsProperty("o1") == true;
 assert ps.containsProperty("o2") == true;
 assert ps.containsProperty("o3") == false;
 assert ps.getProperty("o1").equals("v1");
 assert ps.getProperty("o2").equals("");
 assert ps.getProperty("o3") == null;
 
'o2' オプションには引数はありませんが、getProperty("o2") は null ではなく空の文字列("")に解決されますが、getProperty("o3") は指定されなかったため null に解決されます。この動作は、すべての PropertySource 実装が従う一般規約と一致しています。

上記の例ではオプション引数を示すために "-" が使用されていましたが、この構文は個々のコマンドライン引数ライブラリによって異なる場合があることにも注意してください。例: JOpt または Commons の CLI ベースの実装では、単一のダッシュ( "-" )、「短い」オプションの引数などが許可される場合があります。

非オプション引数の使用

オプション以外の引数も、この抽象化によってサポートされます。"-" や "-" などのオプションスタイルのプレフィックスなしで指定された引数は、「非オプション引数」と見なされ、特別な "nonOptionArgs" プロパティを介して使用できます。オプション以外の引数が複数指定されている場合、このプロパティの値は、すべての引数を含むコンマ区切りの文字列になります。このアプローチにより、 CommandLinePropertySource からのすべてのプロパティに対して単純で一貫性のある戻り値の型(文字列)が保証されると同時に、Spring Environment およびその組み込み  ConversionService と組み合わせて使用すると変換に役立ちます。次の例を考えてみましょう。

--o1=v1 --o2=v2 /path/to/file1 /path/to/file2
この例では、"o1" と "o2" は「オプション引数」と見なされますが、2 つのファイルシステムパスは「非オプション引数」と見なされます。そのため、次のアサーションは true と評価されます。
 CommandLinePropertySource<?> ps = ...
 assert ps.containsProperty("o1") == true;
 assert ps.containsProperty("o2") == true;
 assert ps.containsProperty("nonOptionArgs") == true;
 assert ps.getProperty("o1").equals("v1");
 assert ps.getProperty("o2").equals("v2");
 assert ps.getProperty("nonOptionArgs").equals("/path/to/file1,/path/to/file2");
 

上記のように、Spring Environment 抽象化と組み合わせて使用すると、このカンマ区切りの文字列は、簡単に文字列配列またはリストに変換できます。

 Environment env = applicationContext.getEnvironment();
 String[] nonOptionArgs = env.getProperty("nonOptionArgs", String[].class);
 assert nonOptionArgs[0].equals("/path/to/file1");
 assert nonOptionArgs[1].equals("/path/to/file2");
 

特別な「オプション以外の引数」プロパティの名前は、setNonOptionArgsPropertyName(String) メソッドを使用してカスタマイズできます。オプション以外の引数に適切なセマンティック値を与えるため、そうすることをお勧めします。例: ファイルシステムパスがオプション以外の引数として指定されている場合、これらをデフォルトの "nonOptionArgs" よりも "file.locations" のようなものとして参照することをお勧めします。

 public static void main(String[] args) {
     CommandLinePropertySource clps = ...;
     clps.setNonOptionArgsPropertyName("file.locations");

     AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
     ctx.getEnvironment().getPropertySources().addFirst(clps);
     ctx.register(AppConfig.class);
     ctx.refresh();
 }

制限

この抽象化は、JOpt や CommonsCLI などの基盤となるコマンドライン解析 API の全機能を公開することを目的としたものではありません。その意図はむしろ正反対です。解析されたにコマンドライン引数にアクセスするための可能な限り単純な抽象化を提供することです。一般的なケースでは、基になるコマンドライン解析 API を完全に構成し、main メソッドに入る引数の String[] を解析してから、解析結果を CommandLinePropertySource の実装に提供するだけです。その時点で、すべての引数は「オプション」または「非オプション」引数のいずれかと見なすことができ、上記のように、通常の PropertySource および Environment API を介してアクセスできます。
導入:
3.1
作成者:
Chris Beams
関連事項:
  • フィールドの詳細

    • COMMAND_LINE_PROPERTY_SOURCE_NAME

      public static final StringSE COMMAND_LINE_PROPERTY_SOURCE_NAME
      CommandLinePropertySource インスタンスに付けられたデフォルト名: "commandLineArgs"。
      関連事項:
    • DEFAULT_NON_OPTION_ARGS_PROPERTY_NAME

      public static final StringSE DEFAULT_NON_OPTION_ARGS_PROPERTY_NAME
      非オプション引数を表すプロパティのデフォルト名: "nonOptionArgs"。
      関連事項:
  • コンストラクターの詳細

    • CommandLinePropertySource

      public CommandLinePropertySource(T source)
      デフォルトの名前 "commandLineArgs" を持ち、指定されたソースオブジェクトに基づく新しい CommandLinePropertySource を作成します。
    • CommandLinePropertySource

      public CommandLinePropertySource(StringSE name, T source)
      指定された名前を持ち、指定されたソースオブジェクトに基づく新しい CommandLinePropertySource を作成します。
  • メソッドの詳細

    • setNonOptionArgsPropertyName

      public void setNonOptionArgsPropertyName(StringSE nonOptionArgsPropertyName)
      特別な「非オプション引数」プロパティの名前を指定します。デフォルトは "nonOptionArgs" です。
    • containsProperty

      public final boolean containsProperty(StringSE name)
      この実装は、最初に指定された名前が特別な「非オプション引数」プロパティであるかどうかを確認し、そうである場合は、抽象 getNonOptionArgs() メソッドに委譲して、空のコレクションを返すかどうかを確認します。それ以外の場合は、抽象 containsOption(String) メソッドに委譲してその値を返します。
      オーバーライド:
      クラス EnumerablePropertySource<T>containsProperty 
      パラメーター:
      name - 検索するプロパティの名前
    • getProperty

      @Nullable public final StringSE getProperty(StringSE name)
      この実装は、最初に、指定された名前が特別な「非オプション引数」プロパティであるかどうかを確認し、そうである場合は、抽象 getNonOptionArgs() メソッドに委譲します。その場合、オプション以外の引数のコレクションが空の場合、このメソッドは  null を返します。空でない場合は、オプション以外のすべての引数のコンマ区切りの文字列を返します。それ以外の場合は、抽象 getOptionValues(String) メソッドに委譲して結果を返します。
      次で指定:
      クラス PropertySource<T>getProperty 
      パラメーター:
      name - 検索するプロパティ
      関連事項:
    • containsOption

      protected abstract boolean containsOption(StringSE name)
      コマンドラインから解析されたオプション引数のセットに、指定された名前のオプションが含まれているかどうかを返します。
    • getOptionValues

      @Nullable protected abstract ListSE<StringSE> getOptionValues(StringSE name)
      指定された名前を持つコマンドラインオプションに関連付けられた値のコレクションを返します。
      • オプションが存在し、引数がない場合(例: "--foo")、空のコレクションを返します ([])
      • オプションが存在し、単一の値( "--foo=bar" など)を持っている場合、1 つの要素を持つコレクションを返します (["bar"])
      • オプションが存在し、基礎となるコマンドライン解析ライブラリが複数の引数をサポートしている場合(例: "--foo=bar --foo=baz")、各値の要素を持つコレクションを返します (["bar", "baz"])
      • オプションが存在しない場合は、null を返します
    • getNonOptionArgs

      protected abstract ListSE<StringSE> getNonOptionArgs()
      コマンドラインから解析された非オプション引数のコレクションを返します。非 null