public class ReloadableResourceBundleMessageSource extends AbstractResourceBasedMessageSource implements ResourceLoaderAware
ApplicationContext
のリソースロードに参加する、Spring 固有の MessageSource
実装。JDK ベースの ResourceBundleMessageSource
とは対照的に、このクラスはメッセージのカスタムデータ構造として Properties
SE インスタンスを使用し、Spring Resource
ハンドルから PropertiesPersister
戦略を介してロードします。この方法では、タイムスタンプの変更に基づいてファイルを再ロードできるだけでなく、特定の文字エンコーディングでプロパティファイルをロードすることもできます。XML プロパティファイルも検出します。
"basenames"
プロパティとして設定されたベース名は、ResourceBundleMessageSource
の "basenames" プロパティとは少し異なる方法で処理されることに注意してください。ファイル拡張子や言語コードを指定しないという基本的な 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 に感謝します。
AbstractResourceBasedMessageSource.setCacheSeconds(int)
, AbstractResourceBasedMessageSource.setBasenames(java.lang.String...)
, AbstractResourceBasedMessageSource.setDefaultEncoding(java.lang.String)
, setFileEncodings(java.util.Properties)
, setPropertiesPersister(org.springframework.util.PropertiesPersister)
, setResourceLoader(org.springframework.core.io.ResourceLoader)
, ResourcePropertiesPersister
, DefaultResourceLoader
, ResourceBundleMessageSource
, ResourceBundle
SE修飾子と型 | クラスと説明 |
---|---|
protected class | ReloadableResourceBundleMessageSource.PropertiesHolder キャッシュ用の PropertiesHolder。 |
logger
コンストラクターと説明 |
---|
ReloadableResourceBundleMessageSource() |
修飾子と型 | メソッドと説明 |
---|---|
protected ListSE<StringSE> | calculateAllFilenames(StringSE basename, LocaleSE locale) 指定されたバンドルのベース名とロケールのすべてのファイル名を計算します。 |
protected ListSE<StringSE> | calculateFilenamesForLocale(StringSE basename, LocaleSE locale) 特定のバンドルのベース名とロケールのファイル名を計算し、言語コード、国コード、バリアントコードを追加します。 |
void | clearCache() リソースバンドルキャッシュをクリアします。 |
void | clearCacheIncludingAncestors() この MessageSource とそのすべての祖先のリソースバンドルキャッシュをクリアします。 |
protected ReloadableResourceBundleMessageSource.PropertiesHolder | getMergedProperties(LocaleSE locale) 指定されたすべてのリソースバンドルをマージした後、ロケールに実際に表示されるプロパティを含む PropertiesHolder を取得します。 |
protected ReloadableResourceBundleMessageSource.PropertiesHolder | getProperties(StringSE filename) 指定されたファイル名の PropertiesHolder を、キャッシュから、新たにロードして取得します。 |
protected PropertiesSE | loadProperties(Resource resource, StringSE filename) 指定されたリソースからプロパティをロードします。 |
protected PropertiesSE | newProperties() プレーンな新しい Properties SE インスタンスを作成するためのテンプレートメソッド。 |
protected ReloadableResourceBundleMessageSource.PropertiesHolder | refreshProperties(StringSE filename, ReloadableResourceBundleMessageSource.PropertiesHolder propHolder) 指定されたバンドルファイル名の PropertiesHolder をリフレッシュします。 |
protected MessageFormatSE | resolveCode(StringSE code, LocaleSE locale) メッセージコードごとにキャッシュされた MessageFormat インスタンスを使用して、取得されたバンドルファイルのキーとして指定されたメッセージコードを解決します。 |
protected StringSE | resolveCodeWithoutArguments(StringSE code, LocaleSE locale) 取得されたバンドルファイルのキーとして指定されたメッセージコードを解決し、バンドルで見つかった値をそのまま返します(MessageFormat 解析なし)。 |
void | setConcurrentRefresh(boolean concurrentRefresh) 同時リフレッシュ動作を許可するかどうかを指定します。 |
void | setFileEncodings(PropertiesSE fileEncodings) プロパティファイルの解析に使用するファイルごとの文字セットを設定します。 |
void | setPropertiesPersister(PropertiesPersister propertiesPersister) プロパティファイルの解析に使用する PropertiesPersister を設定します。 |
void | setResourceLoader(ResourceLoader resourceLoader) バンドルプロパティファイルのロードに使用する ResourceLoader を設定します。 |
StringSE | toString() |
addBasenames, getBasenameSet, getCacheMillis, getDefaultEncoding, getDefaultLocale, isFallbackToSystemLocale, setBasename, setBasenames, setCacheMillis, setCacheSeconds, setDefaultEncoding, setDefaultLocale, setFallbackToSystemLocale
getCommonMessages, getDefaultMessage, getDefaultMessage, getMessage, getMessage, getMessage, getMessageFromParent, getMessageInternal, getParentMessageSource, isUseCodeAsDefaultMessage, resolveArguments, setCommonMessages, setParentMessageSource, setUseCodeAsDefaultMessage
createMessageFormat, formatMessage, isAlwaysUseMessageFormat, renderDefaultMessage, setAlwaysUseMessageFormat
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, waitSE, waitSE, waitSE
public void setFileEncodings(PropertiesSE fileEncodings)
クラシックプロパティファイルにのみ適用され、XML ファイルには適用されません。
fileEncodings
- ファイル名をキー、文字セット名を値とするプロパティ。ファイル名は、オプションのロケール固有のコンポーネントを使用して、basename 構文と一致する必要があります。"WEB-INF/messages" または "WEB-INF/messages_en"。AbstractResourceBasedMessageSource.setBasenames(java.lang.String...)
, PropertiesPersister.load(java.util.Properties, java.io.InputStream)
public void setConcurrentRefresh(boolean concurrentRefresh)
デフォルトは「true」: この動作は Spring Framework 4.1 から新しくなり、スレッド間の競合を最小限に抑えています。以前の動作、つまりリフレッシュ時に完全にブロックする場合は、このフラグを "false" に切り替えます。
public void setPropertiesPersister(@Nullable PropertiesPersister propertiesPersister)
デフォルトは ResourcePropertiesPersister です。
public void setResourceLoader(@Nullable ResourceLoader resourceLoader)
デフォルトは DefaultResourceLoader です。コンテキストで実行されている場合、ResourceLoaderAware インターフェースを実装しているため、ApplicationContext によってオーバーライドされます。ApplicationContext の外部で実行する場合は、手動でオーバーライドできます。
ResourceLoaderAware
の setResourceLoader
resourceLoader
- このオブジェクトによって使用される ResourceLoader オブジェクト DefaultResourceLoader
, ResourceLoaderAware
protected StringSE resolveCodeWithoutArguments(StringSE code, LocaleSE locale)
AbstractMessageSource
の resolveCodeWithoutArguments
code
- 解決するメッセージのコード locale
- コードを解決するロケール (サブクラスは国際化をサポートすることが推奨されます)null
AbstractMessageSource.resolveCode(java.lang.String, java.util.Locale)
, MessageFormat
SE@Nullable protected MessageFormatSE resolveCode(StringSE code, LocaleSE locale)
AbstractMessageSource
の resolveCode
code
- 解決するメッセージのコード locale
- コードを解決するロケール (サブクラスは国際化をサポートすることが推奨されます)null
AbstractMessageSource.resolveCodeWithoutArguments(String, java.util.Locale)
protected ReloadableResourceBundleMessageSource.PropertiesHolder getMergedProperties(LocaleSE locale)
リソースバンドルの内容を永久にキャッシュする場合にのみ使用されます (つまり、cacheSeconds < 0)。マージされたプロパティは常に永久にキャッシュされます。
protected ListSE<StringSE> calculateAllFilenames(StringSE basename, LocaleSE locale)
basename
- バンドルのベース名 locale
- ロケール AbstractResourceBasedMessageSource.setFallbackToSystemLocale(boolean)
, calculateFilenamesForLocale(java.lang.String, java.util.Locale)
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()
SE で定義されたルールに従います。
basename
- バンドルのベース名 locale
- ロケール protected ReloadableResourceBundleMessageSource.PropertiesHolder getProperties(StringSE filename)
filename
- バンドルのファイル名 (ベース名 + ロケール)protected ReloadableResourceBundleMessageSource.PropertiesHolder refreshProperties(StringSE filename, @Nullable ReloadableResourceBundleMessageSource.PropertiesHolder propHolder)
null
か、タイムアウトしたキャッシュエントリ(現在の最終変更タイムスタンプに対して再検証される可能性があります)になります。filename
- バンドルのファイル名 (ベース名 + ロケール)propHolder
- バンドルの現在の PropertiesHolderprotected PropertiesSE loadProperties(Resource resource, StringSE filename) throws IOExceptionSE
resource
- ロード元のリソース filename
- 元のバンドルファイル名 (ベース名 + ロケール)IOExceptionSE
- プロパティの読み込みに失敗した場合 protected PropertiesSE newProperties()
Properties
SE インスタンスを作成するためのテンプレートメソッド。デフォルトの実装では、単に Properties()
SE を呼び出します。 サブクラスでカスタム Properties
SE 拡張を返すことができます。オーバーライドするメソッドは、カスタム Properties
SE サブクラスをインスタンス化するだけで、その時点でそれ以上の初期化やポピュレーションは実行されません。
public void clearCache()
public void clearCacheIncludingAncestors()
clearCache()
public StringSE toString()
ObjectSE
の toStringSE