アノテーションインターフェース 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 アノテーションの ${...} プレースホルダーを解決するには、適切なエンベディッドバリューリゾルバーが ApplicationContext で使用される BeanFactory に登録されていることを確認する必要があります。これは、XML で <context:property-placeholder> を使用すると自動的に発生します。@Configuration クラスを使用する場合、これは、static@Bean メソッドを介して PropertySourcesPlaceholderConfigurer を明示的に登録することで実現できます。ただし、static@Bean メソッドを介した PropertySourcesPlaceholderConfigurer の明示的な登録は、通常、プレースホルダー構文などの設定をカスタマイズする必要がある場合にのみ必要であることに注意してください。@Configuration の javadoc の「外部化された値の操作」セクションおよび「 詳細と例については、@Bean の javadoc の「 @Bean メソッドを返す BeanFactoryPostProcessor」に関する注記を参照してください。

@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 がスローされます。

@PropertySource でオーバーライドするプロパティに関する注意

特定のプロパティキーが複数のプロパティリソースファイルに存在する場合、最後に処理された @PropertySource アノテーションが「優先」され、同じ名前の以前のキーが上書きされます。

例: 2 つのプロパティファイル a.properties および b.properties が与えられた場合、@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 に存在する重複をオーバーライドします。

特定の状況では、@PropertySource アノテーションを使用するときにプロパティソースの順序を厳密に制御することが不可能または実用的でない場合があります。例: 上記の @Configuration クラスがコンポーネントスキャンによって登録された場合、順序を予測することは困難です。そのような場合 — 上書きが重要な場合 — ユーザーがプログラムによる PropertySource API の使用にフォールバックすることをお勧めします。詳細については、ConfigurableEnvironment および MutablePropertySources javadoc を参照してください。

@PropertySource は反復可能なSEアノテーションとして使用できます。@PropertySource は、属性オーバーライドを持つカスタム合成アノテーションを作成するためのメタアノテーションとしても使用できます。

導入:
3.1
作成者:
Chris Beams, Juergen Hoeller, Phillip Webb, Sam Brannen
関連事項:
  • 必須定数のサマリー

    必須要素
    修飾子と型
    必須要素
    説明
    ロードするプロパティファイルのリソースの場所を指定します。
  • オプション要素のサマリー

    オプション要素
    修飾子と型
    オプションの要素
    説明
    指定されたリソースの特定の文字エンコーディング。
    カスタム PropertySourceFactory を指定します(ある場合)。
    boolean
    property resource の検索の失敗を無視する必要があるかどうかを示します。
    このプロパティソースの一意の名前を示します。
  • 要素の詳細

    • value

      StringSE[] value
      ロードするプロパティファイルのリソースの場所を指定します。

      デフォルトの factory は、従来のプロパティファイル形式と XML ベースのプロパティファイル形式の両方をサポートしています。たとえば、"classpath:/com/myco/app.properties" または "file:/path/to/file.xml" です。

      Spring Framework 6.1 以降、リソースの場所のワイルドカードもサポートされています。たとえば、"classpath*:/config/*.properties"

      ${...} プレースホルダーは、すでに Environment に登録されているプロパティソースに対して解決されます。例については上記を参照してください。

      各場所は、宣言された順序 (または、場所のワイルドカードが使用されている場合はリソースの場所が解決される順序) で、それを囲む Environment に独自のプロパティソースとして追加されます。

    • name

      StringSE name
      このプロパティソースの一意の名前を示します。

      省略した場合、factory() は基になるリソースに基づいて名前を生成します ( DefaultPropertySourceFactory の場合: 対応する名前のない ResourcePropertySource コンストラクターを通じてリソースの説明から派生します)。

      PropertySource の名前には 2 つの一般的な目的があります。

      • 診断: ログ記録とデバッグでプロパティのソースを特定するため - たとえば、Spring Boot の PropertySourceOrigin を介した Spring Boot アプリケーション内です。
      • MutablePropertySources とのプログラムによる対話: 名前を使用して、特定のプロパティソースからプロパティを取得する (または、特定の名前付きプロパティソースがすでに存在するかどうかを判断する) ことができます。この名前を使用して、既存のプロパティソースに関連する新しいプロパティソースを追加することもできます ( addBefore() および addAfter() を参照)。
      関連事項:
      デフォルト:
      ""
    • ignoreResourceNotFound

      boolean ignoreResourceNotFound
      property resource の検索の失敗を無視する必要があるかどうかを示します。

      プロパティファイルが完全にオプションの場合は、true が適切です。

      デフォルトは false です。

      導入:
      4.0
      デフォルト:
      false
    • encoding

      StringSE encoding
      指定されたリソースの特定の文字エンコーディング。"UTF-8"。
      導入:
      4.3
      デフォルト:
      ""
    • factory

      ClassSE<? extends PropertySourceFactory> factory
      カスタム PropertySourceFactory を指定します(ある場合)。

      デフォルトでは、PropertiesSE の *.properties および *.xml ファイル形式をサポートする標準リソースファイルのデフォルトファクトリが使用されます。

      導入:
      4.3
      関連事項:
      デフォルト:
      org.springframework.core.io.support.PropertySourceFactory.class