クラス ReloadableResourceBundleMessageSource

実装されたすべてのインターフェース:
AwareHierarchicalMessageSourceMessageSourceResourceLoaderAware

public class ReloadableResourceBundleMessageSource extends AbstractResourceBasedMessageSource implements ResourceLoaderAware
指定されたベース名を使用してリソースバンドルにアクセスし、Spring ApplicationContext のリソースロードに参加する、Spring 固有の MessageSource 実装。

JDK ベースの ResourceBundleMessageSource とは対照的に、このクラスはメッセージのカスタムデータ構造として PropertiesSE インスタンスを使用し、Spring Resource ハンドルから PropertiesPersister 戦略を介してロードします。この方法では、タイムスタンプの変更に基づいてファイルを再ロードできるだけでなく、特定の文字エンコーディングでプロパティファイルをロードすることもできます。XML プロパティファイルも検出します。

"basenames" プロパティとして設定されたベース名は、ResourceBundleMessageSource の「ベース名」プロパティとは少し異なる方法で処理されることに注意してください。これは、ファイル拡張子や言語コードを指定しないという基本的な ResourceBundle ルールに従いますが、(クラスパスリソースに制限されるのではなく)Spring リソースの場所を参照できます。"classpath:" 接頭辞を使用しても、リソースをクラスパスからロードできますが、この場合、"-1"(永遠にキャッシュ)以外の "cacheSeconds" 値は確実に機能しない可能性があります。

典型的な Web アプリケーションの場合、メッセージファイルは WEB-INF に配置できます。たとえば、"WEB-INF/messages" ベース名は "WEB-INF/messages.properties"、"WEB-INF/messages_en.properties" などの配置も検索します "WEB-INF/messages.xml"、"WEB-INF/messages_en.xml" など。順次検索により、 前のリソースバンドルのメッセージ定義が後のバンドルのメッセージ定義をオーバーライドすることに注意してください。

この MessageSource は、ApplicationContext の外部で簡単に使用できます。デフォルトとして DefaultResourceLoader を使用し、コンテキストで実行している場合は、ApplicationContext のリソースローダーでオーバーライドされます。その他の特定の依存関係はありません。

このメッセージソースの初期実装を提供してくれた Thomas Achleitner に感謝します。

作成者:
Juergen Hoeller, Sebastien Deleuze
関連事項:
  • コンストラクターの詳細

    • ReloadableResourceBundleMessageSource

      public ReloadableResourceBundleMessageSource()
  • メソッドの詳細

    • setFileExtensions

      public void setFileExtensions(ListSE<StringSE> fileExtensions)
      サポートされるファイル拡張子のリストを設定します。

      デフォルトは、.properties および .xml を含むリストです。

      パラメーター:
      fileExtensions - ファイル拡張子 (ドットで始まる)
      導入:
      6.1
    • setFileEncodings

      public void setFileEncodings(PropertiesSE fileEncodings)
      プロパティファイルの解析に使用するファイルごとの文字セットを設定します。

      クラシックプロパティファイルにのみ適用され、XML ファイルには適用されません。

      パラメーター:
      fileEncodings - ファイル名をキー、文字セット名を値とするプロパティ。ファイル名は、オプションのロケール固有のコンポーネントを使用して、basename 構文と一致する必要があります。"WEB-INF/messages" または "WEB-INF/messages_en"。
      関連事項:
    • setConcurrentRefresh

      public void setConcurrentRefresh(boolean concurrentRefresh)
      同時リフレッシュ動作を許可するかどうかを指定します。つまり、特定のキャッシュされたプロパティファイルのリフレッシュ試行で 1 つのスレッドがロックされる一方で、リフレッシュ試行が完了するまで、他のスレッドはしばらくの間古いプロパティを返し続けます。

      デフォルトは「true」: この動作は Spring Framework 4.1 から新しくなり、スレッド間の競合を最小限に抑えています。以前の動作、つまりリフレッシュ時に完全にブロックする場合は、このフラグを "false" に切り替えます。

      導入:
      4.1
      関連事項:
    • setPropertiesPersister

      public void setPropertiesPersister(@Nullable PropertiesPersister propertiesPersister)
      プロパティファイルの解析に使用する PropertiesPersister を設定します。

      デフォルトは DefaultPropertiesPersister です。

      関連事項:
    • setResourceLoader

      public void setResourceLoader(@Nullable ResourceLoader resourceLoader)
      バンドルプロパティファイルのロードに使用する ResourceLoader を設定します。

      デフォルトは DefaultResourceLoader です。ResourceLoaderAware インターフェースを実装しているため、コンテキストで実行している場合、ApplicationContext によってオーバーライドされます。ApplicationContext の外部で実行している場合は、手動でオーバーライドできます。

      次で指定:
      インターフェース ResourceLoaderAwaresetResourceLoader 
      パラメーター:
      resourceLoader - このオブジェクトによって使用される ResourceLoader オブジェクト
      関連事項:
    • resolveCodeWithoutArguments

      @Nullable protected StringSE resolveCodeWithoutArguments(StringSE code, LocaleSE locale)
      取得されたバンドルファイルのキーとして指定されたメッセージコードを解決し、バンドルで見つかった値をそのまま返します(MessageFormat 解析なし)。
      オーバーライド:
      クラス AbstractMessageSourceresolveCodeWithoutArguments 
      パラメーター:
      code - 解決するメッセージのコード
      locale - コードを解決するロケール (サブクラスは国際化をサポートすることが推奨されます)
      戻り値:
      メッセージ文字列、または見つからない場合は null 
      関連事項:
    • resolveCode

      @Nullable protected MessageFormatSE resolveCode(StringSE code, LocaleSE locale)
      メッセージコードごとにキャッシュされた MessageFormat インスタンスを使用して、取得されたバンドルファイルのキーとして指定されたメッセージコードを解決します。
      次で指定:
      クラス AbstractMessageSourceresolveCode 
      パラメーター:
      code - 解決するメッセージのコード
      locale - コードを解決するロケール (サブクラスは国際化をサポートすることが推奨されます)
      戻り値:
      メッセージの MessageFormat。見つからない場合は null 
      関連事項:
    • getMergedProperties

      protected ReloadableResourceBundleMessageSource.PropertiesHolder getMergedProperties(LocaleSE locale)
      指定されたすべてのリソースバンドルをマージした後、ロケールに実際に表示されるプロパティを含む PropertiesHolder を取得します。ホルダーをキャッシュからフェッチするか、新たにロードします。

      リソースバンドルのコンテンツを永久にキャッシュする場合、つまり cacheSeconds <0 の場合にのみ使用されます。マージされたプロパティは常に永久にキャッシュされます。

      関連事項:
    • collectPropertiesToMerge

      protected ListSE<ReloadableResourceBundleMessageSource.PropertiesHolder> collectPropertiesToMerge(LocaleSE locale)
      指定されたベース名に基づいてマージするプロパティを決定します。
      パラメーター:
      locale - ロケール
      戻り値:
      財産所有者のリスト
      導入:
      6.1.4
      関連事項:
    • mergeProperties

      指定されたプロパティホルダーを 1 つのホルダーにマージします。
      パラメーター:
      holders - 財産所有者のリスト
      戻り値:
      単一のマージされたプロパティホルダー
      導入:
      6.1.4
      関連事項:
    • calculateAllFilenames

      protected ListSE<StringSE> calculateAllFilenames(StringSE basename, LocaleSE locale)
      指定されたバンドルのベース名とロケールのすべてのファイル名を計算します。指定されたロケール、システムロケール(該当する場合)、デフォルトファイルのファイル名を計算します。
      パラメーター:
      basename - バンドルのベース名
      locale - ロケール
      戻り値:
      チェックするファイル名のリスト
      関連事項:
    • calculateFilenamesForLocale

      protected ListSE<StringSE> calculateFilenamesForLocale(StringSE basename, LocaleSE locale)
      特定のバンドルのベース名とロケールのファイル名を計算し、言語コード、国コード、バリアントコードを追加します。

      例: basename "messages"、Locale "de_AT_oo" → "messages_de_AT_OO"、"messages_de_AT"、"messages_de"。

      Locale.toString() で定義されたルールに従います。

      パラメーター:
      basename - バンドルのベース名
      locale - ロケール
      戻り値:
      チェックするファイル名のリスト
    • getProperties

      指定されたファイル名の PropertiesHolder を、キャッシュから、新たにロードして取得します。
      パラメーター:
      filename - バンドルのファイル名 (ベース名 + ロケール)
      戻り値:
      バンドルの現在の PropertiesHolder
    • refreshProperties

      指定されたバンドルファイル名の PropertiesHolder をリフレッシュします。

      以前にキャッシュされていない場合、ホルダーは null、またはタイムアウトしたキャッシュエントリ (現在の最終変更タイムスタンプに対して再検証される可能性があります) である可能性があります。

      パラメーター:
      filename - バンドルのファイル名 (ベース名 + ロケール)
      propHolder - バンドルの現在の PropertiesHolder
      関連事項:
    • resolveResource

      @Nullable protected Resource resolveResource(StringSE filename)
      指定されたバンドル filename を具体的な Resource に解決し、複数のソースまたはファイル拡張子をチェックする可能性があります。

      適切な具体的な Resource を解決できない場合、このメソッドは Resource を返し、それに対して Resource.exists() は false を返しますが、これはその後無視されます。

      これを利用して、最終変更タイムスタンプを確認したり、代替ソースからプロパティをロードしたりできます。たとえば、データベース内の XML BLOB から、または JSON などのカスタム形式を使用して直列化されたプロパティから。

      デフォルトの実装は、リソースの解決を構成済みの ResourceLoader に委譲し、setFileExtensions(List) によって定義された拡張機能 (デフォルトでは .properties および .xml ) を持つ既存の Resource を順番にチェックします。

      このメソッドをオーバーライドする場合、loadProperties(Resource, String) は、このメソッドによって返される任意の型の Resource からプロパティをロードできる必要があります。結果として、実装者には loadProperties() もオーバーライドすることが強く推奨されます。

      このメソッドをオーバーライドする代わりに、このメソッドによって返されるすべてのリソースを処理できる PropertiesPersister を構成できます。ただし、デフォルトの loadProperties() 実装では XML リソースに対して loadFromXml を使用し、それ以外の場合は他の型のリソースに対して 2 つの load メソッドを使用することに注意してください。

      パラメーター:
      filename - バンドルのファイル名 (ベース名 + ロケール)
      戻り値:
      使用する Resource、または見つからない場合は null 
      導入:
      6.1
    • loadProperties

      protected PropertiesSE loadProperties(Resource resource, StringSE filename) throws IOExceptionSE
      指定されたリソースからプロパティをロードします。
      パラメーター:
      resource - ロード元のリソース
      filename - 元のバンドルファイル名 (ベース名 + ロケール)
      戻り値:
      移入された Properties インスタンス
      例外:
      IOExceptionSE - プロパティの読み込みに失敗した場合
    • newProperties

      protected PropertiesSE newProperties()
      プレーンな新しい PropertiesSE インスタンスを作成するためのテンプレートメソッド。デフォルトの実装では、単に Properties() を呼び出します。

      サブクラスでカスタム PropertiesSE 拡張を返すことができます。オーバーライドするメソッドは、カスタム PropertiesSE サブクラスをインスタンス化するだけで、その時点でそれ以上の初期化やポピュレーションは実行されません。

      戻り値:
      プレーンプロパティインスタンス
      導入:
      4.2
    • clearCache

      public void clearCache()
      リソースバンドルキャッシュをクリアします。その後の resolve 呼び出しは、プロパティファイルのリロードにつながります。
    • clearCacheIncludingAncestors

      public void clearCacheIncludingAncestors()
      この MessageSource とそのすべての祖先のリソースバンドルキャッシュをクリアします。
      関連事項:
    • toString

      public StringSE toString()
      オーバーライド:
      クラス ObjectSEtoString