@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 | ignoreResourceNotFound property 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