クラス CommandLinePropertySource<T>
- 型パラメーター:
T
- ソース型
PropertySource
実装の抽象基本クラス。パラメーター化された型 T
は、コマンドラインオプションの基礎となるソースを表します。たとえば、SimpleCommandLinePropertySource
は String 配列を使用します。目的と一般的な使用箇所
スタンドアロンの Spring ベースのアプリケーション、つまりコマンドラインから引数のString[]
を受け入れる従来の main
メソッドを介してブートストラップされるアプリケーションで使用するため。多くの場合、main
メソッド内で直接コマンドライン引数を処理することで十分ですが、他の場合では、引数を値として Spring Bean に挿入することが望ましい場合があります。CommandLinePropertySource
が役立つのは、後者の場合です。CommandLinePropertySource
は通常、Spring ApplicationContext
の Environment
に追加されます。この時点で、すべてのコマンドライン引数が 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
メソッドを使用して Environment
の MutablePropertySources
のセットに追加されたため、検索の優先順位が最も高くなります。つまり、"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
- 関連事項:
ネストされたクラスのサマリー
クラス org.springframework.core.env.PropertySource から継承されたネストクラス / インターフェース
PropertySource.StubPropertySource
フィールドサマリー
修飾子と型フィールド説明static final StringSE
CommandLinePropertySource
インスタンスに付けられるデフォルト名: "commandLineArgs"。static final StringSE
オプション以外の引数を表すプロパティのデフォルト名: "nonOptionArgs"。クラス org.springframework.core.env.PropertySource から継承されたフィールド
logger, name, source
コンストラクターのサマリー
コンストラクター説明CommandLinePropertySource
(StringSE name, T source) 指定された名前を持ち、指定されたソースオブジェクトに基づく新しいCommandLinePropertySource
を作成します。CommandLinePropertySource
(T source) デフォルトの名前 "commandLineArgs" を持ち、指定されたソースオブジェクトに基づく新しいCommandLinePropertySource
を作成します。メソッドのサマリー
修飾子と型メソッド説明protected abstract boolean
containsOption
(StringSE name) コマンドラインから解析されたオプション引数のセットに、指定された名前のオプションが含まれているかどうかを返します。final boolean
containsProperty
(StringSE name) この実装は最初に、指定された名前が特別な「非オプション引数」プロパティであるかどうかを確認し、そうである場合は、抽象getNonOptionArgs()
メソッドチェックに委譲して、空のコレクションを返すかどうかを確認します。コマンドラインから解析された非オプション引数のコレクションを返します。getOptionValues
(StringSE name) 指定された名前を持つコマンドラインオプションに関連付けられた値のコレクションを返します。final StringSE
getProperty
(StringSE name) この実装は最初に、指定された名前が特別な「非オプション引数」プロパティであるかどうかを確認し、そうである場合は抽象getNonOptionArgs()
メソッドに委譲します。void
setNonOptionArgsPropertyName
(StringSE nonOptionArgsPropertyName) 特別な「非オプション引数」プロパティの名前を指定します。クラス org.springframework.core.env.EnumerablePropertySource から継承されたメソッド
getPropertyNames
フィールドの詳細
COMMAND_LINE_PROPERTY_SOURCE_NAME
CommandLinePropertySource
インスタンスに付けられるデフォルト名: "commandLineArgs"。- 関連事項:
DEFAULT_NON_OPTION_ARGS_PROPERTY_NAME
オプション以外の引数を表すプロパティのデフォルト名: "nonOptionArgs"。- 関連事項:
コンストラクターの詳細
CommandLinePropertySource
デフォルトの名前 "commandLineArgs" を持ち、指定されたソースオブジェクトに基づく新しいCommandLinePropertySource
を作成します。CommandLinePropertySource
指定された名前を持ち、指定されたソースオブジェクトに基づく新しいCommandLinePropertySource
を作成します。
メソッドの詳細
setNonOptionArgsPropertyName
特別な「非オプション引数」プロパティの名前を指定します。デフォルトは "nonOptionArgs" です。containsProperty
この実装は、最初に指定された名前が特別な「非オプション引数」プロパティであるかどうかを確認し、そうである場合は、抽象getNonOptionArgs()
メソッドに委譲して、空のコレクションを返すかどうかを確認します。それ以外の場合は、抽象containsOption(String)
メソッドに委譲してその値を返します。- オーバーライド:
- クラス
EnumerablePropertySource<T>
のcontainsProperty
- パラメーター:
name
- 検索するプロパティの名前
getProperty
この実装は、最初に、指定された名前が特別な「非オプション引数」プロパティであるかどうかを確認し、そうである場合は、抽象getNonOptionArgs()
メソッドに委譲します。その場合、オプション以外の引数のコレクションが空の場合、このメソッドはnull
を返します。空でない場合は、オプション以外のすべての引数のコンマ区切りの文字列を返します。それ以外の場合は、抽象getOptionValues(String)
メソッドに委譲して結果を返します。- 次で指定:
- クラス
PropertySource<T>
のgetProperty
- パラメーター:
name
- 検索するプロパティ- 関連事項:
containsOption
コマンドラインから解析されたオプション引数のセットに、指定された名前のオプションが含まれているかどうかを返します。getOptionValues
指定された名前を持つコマンドラインオプションに関連付けられた値のコレクションを返します。- オプションが存在し、引数がない場合(例: "--foo")、空のコレクションを返します (
[]
) - オプションが存在し、単一の値( "--foo=bar" など)を持っている場合、1 つの要素を持つコレクションを返します (
["bar"]
) - オプションが存在し、基礎となるコマンドライン解析ライブラリが複数の引数をサポートしている場合(例: "--foo=bar --foo=baz")、各値の要素を持つコレクションを返します (
["bar", "baz"]
) - オプションが存在しない場合は、
null
を返します
- オプションが存在し、引数がない場合(例: "--foo")、空のコレクションを返します (
getNonOptionArgs
コマンドラインから解析された非オプション引数のコレクションを返します。非null
。