@TargetSE(valueSE=TYPESE) @RetentionSE(valueSE=RUNTIMESE) @DocumentedSE @RepeatableSE(valueSE=PropertySources.class) public @interface PropertySource
PropertySource を Spring の Environment に追加するための便利で宣言的なメカニズムを提供するアノテーション。@Configuration クラスと組み合わせて使用します。 キー / 値ペア testbean.name=myTestBean を含むファイル app.properties を指定すると、次の @Configuration クラスは @PropertySource を使用して app.properties を Environment の PropertySources のセットに提供します。
@Configuration
@PropertySource("classpath:/com/myco/app.properties")
public class AppConfig {
@Autowired
Environment env;
@Bean
public TestBean testBean() {
TestBean testBean = new TestBean();
testBean.setName(env.getProperty("testbean.name"));
return testBean;
}
}Environment オブジェクトは構成クラスに @Autowired され、TestBean オブジェクトを設定するときに使用されることに注意してください。上記の構成では、testBean.getName() を呼び出すと "myTestBean" が返されます。<bean> および @Value アノテーションの ${...} プレースホルダーの解決 PropertySource のプロパティを使用して <bean> 定義または @Value アノテーションの ${...} プレースホルダーを解決するには、PropertySourcesPlaceholderConfigurer を登録する必要があります。これは、XML で <context:property-placeholder> を使用する場合は自動的に発生しますが、@Configuration クラスを使用する場合は、static @Bean メソッドを使用して明示的に登録する必要があります。詳細と例については、@Configuration の javadoc の「外部化された値の操作」セクションおよび @Bean の javadoc の「BeanFactoryPostProcessor-@Bean メソッドを返すことに関する注記」を参照してください。@PropertySource リソースロケーション内の ${...} プレースホルダーの解決 @PropertySource リソースの場所に存在する ${...} プレースホルダーは、環境に対してすでに登録されているプロパティソースのセットに対して解決されます。例:
@Configuration
@PropertySource("classpath:/com/${my.placeholder:default/path}/app.properties")
public class AppConfig {
@Autowired
Environment env;
@Bean
public TestBean testBean() {
TestBean testBean = new TestBean();
testBean.setName(env.getProperty("testbean.name"));
return testBean;
}
}"my.placeholder" がすでに登録されているプロパティソースの 1 つに存在すると仮定します。システムプロパティまたは環境変数の場合、プレースホルダーは対応する値に解決されます。そうでない場合は、"default/path" がデフォルトとして使用されます。デフォルト値(コロン ":" で区切られる)の表現はオプションです。デフォルトが指定されておらず、プロパティを解決できない場合、IllegalArgumentException がスローされます。.properties ファイルに存在する場合、最後に処理された @PropertySource アノテーションが「勝ち」、オーバーライドされます。例: a.properties および b.properties の 2 つのプロパティファイルがある場合、@PropertySource アノテーションで参照する次の 2 つの構成クラスを検討してください。
@Configuration
@PropertySource("classpath:/com/myco/a.properties")
public class ConfigA { }
@Configuration
@PropertySource("classpath:/com/myco/b.properties")
public class ConfigB { }
オーバーライドの順序は、これらのクラスがアプリケーションコンテキストに登録される順序によって異なります。
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext();
ctx.register(ConfigA.class);
ctx.register(ConfigB.class);
ctx.refresh();
上記のシナリオでは、ConfigB が最後に登録されたため、b.properties のプロパティは a.properties に存在する重複をオーバーライドします。 特定の状況では、@ProperySource アノテーションを使用する場合、プロパティソースの順序を厳密に制御することが不可能または実用的でない場合があります。例: 上記の @Configuration クラスがコンポーネントスキャンを介して登録された場合、順序を予測することは困難です。このような場合、およびオーバーライドが重要な場合、ユーザーはプログラムによる PropertySource API の使用にフォールバックすることをお勧めします。詳細については、ConfigurableEnvironment および MutablePropertySources javadoc を参照してください。
PropertySources, Configuration, PropertySource, ConfigurableEnvironment.getPropertySources(), MutablePropertySources| 修飾子と型 | オプションの要素と説明 |
|---|---|
StringSE | encoding 指定されたリソースの特定の文字エンコーディング。 |
ClassSE<? extends PropertySourceFactory> | factory カスタム PropertySourceFactory を指定します(ある場合)。 |
boolean | ignoreResourceNotFoundproperty resource の検出の失敗を無視する必要があるかどうかを示します。 |
StringSE | name このプロパティソースの名前を示します。 |
public abstract StringSE[] value
"classpath:/com/myco/app.properties" または "file:/path/to/file"。 リソースの場所のワイルドカード(例: ** /*.properties) は許可されていません。各場所は、正確に 1 つの .properties リソースに評価される必要があります。
${...} プレースホルダーは、Environment にすでに登録されているすべてのプロパティソースに対して解決されます。例については、上記を参照してください。
各場所は、独自のプロパティソースとして、宣言された順序で、包含 Environment に追加されます。
public abstract StringSE name
public abstract boolean ignoreResourceNotFound
property resource の検出の失敗を無視する必要があるかどうかを示します。 プロパティファイルが完全にオプションである場合、true が適切です。デフォルトは false です。
public abstract StringSE encoding
public abstract ClassSE<? extends PropertySourceFactory> factory
PropertySourceFactory を指定します(ある場合)。デフォルトでは、標準リソースファイルのデフォルトファクトリが使用されます。
DefaultPropertySourceFactory, ResourcePropertySource