MessageSource implementation that
accesses resource bundles using specified basenames. This class uses
Properties instances as its custom data structure for
messages, loading them via a PropertiesPersister
strategy: The default strategy is capable of loading properties files
with a specific character encoding, if desired.

In contrast to ResourceBundleMessageSource, this class supports
reloading of properties files through the "cacheSeconds"
setting, and also through programmatically clearing the properties cache.
Since application servers typically cache all files loaded from the classpath,
it is necessary to store resources somewhere else (for example, in the
"WEB-INF" directory of a web app). Otherwise changes of files in the
classpath will not be reflected in the application.

Note that the base names set as "basenames" property
are treated in a slightly different fashion than the "basenames" property of
ResourceBundleMessageSource. It follows the basic ResourceBundle rule of not
specifying file extension or language codes, but can refer to any Spring resource
location (instead of being restricted to classpath resources). With a "classpath:"
prefix, resources can still be loaded from the classpath, but "cacheSeconds" values
other than "-1" (caching forever) will not work in this case.

This MessageSource implementation is usually slightly faster than
ResourceBundleMessageSource, which builds on ResourceBundle
- in the default mode, i.e. when caching forever. With "cacheSeconds" set to 1,
message lookup takes about twice as long - with the benefit that changes in
individual properties files are detected with a maximum delay of 1 second.
Higher "cacheSeconds" values usually do not make a significant difference.

This MessageSource can easily be used outside of an
ApplicationContext: It will use a
DefaultResourceLoader as default,
simply getting overridden with the ApplicationContext's resource loader
if running in a context. It does not have any other specific dependencies.

Thanks to Thomas Achleitner for providing the initial implementation of
this message source!

resolveCodeWithoutArguments(String code,
Locale locale)
Resolves the given message code as key in the retrieved bundle files,
returning the value found in the bundle as-is (without MessageFormat parsing).

void

setBasename(String basename)
Set a single basename, following the basic ResourceBundle convention of
not specifying file extension or language codes, but in contrast to
ResourceBundleMessageSource referring to a Spring resource location:
e.g.

void

setBasenames(String[] basenames)
Set an array of basenames, each following the basic ResourceBundle convention
of not specifying file extension or language codes, but in contrast to
ResourceBundleMessageSource referring to a Spring resource location:
e.g.

void

setCacheSeconds(int cacheSeconds)
Set the number of seconds to cache loaded properties files.

ReloadableResourceBundleMessageSource

setBasename

Set a single basename, following the basic ResourceBundle convention of
not specifying file extension or language codes, but in contrast to
ResourceBundleMessageSource referring to a Spring resource location:
e.g. "WEB-INF/messages" for "WEB-INF/messages.properties",
"WEB-INF/messages_en.properties", etc.

As of Spring 1.2.2, XML properties files are also supported:
e.g. "WEB-INF/messages" will find and load "WEB-INF/messages.xml",
"WEB-INF/messages_en.xml", etc as well. Note that this will only
work on JDK 1.5+.

setBasenames

Set an array of basenames, each following the basic ResourceBundle convention
of not specifying file extension or language codes, but in contrast to
ResourceBundleMessageSource referring to a Spring resource location:
e.g. "WEB-INF/messages" for "WEB-INF/messages.properties",
"WEB-INF/messages_en.properties", etc.

As of Spring 1.2.2, XML properties files are also supported:
e.g. "WEB-INF/messages" will find and load "WEB-INF/messages.xml",
"WEB-INF/messages_en.xml", etc as well. Note that this will only
work on JDK 1.5+.

The associated resource bundles will be checked sequentially
when resolving a message code. Note that message definitions in a
previous resource bundle will override ones in a later bundle,
due to the sequential lookup.

setFileEncodings

fileEncodings - Properties with filenames as keys and charset
names as values. Filenames have to match the basename syntax,
with optional locale-specific appendices: e.g. "WEB-INF/messages"
or "WEB-INF/messages_en".

setFallbackToSystemLocale

public void setFallbackToSystemLocale(boolean fallbackToSystemLocale)

Set whether to fall back to the system Locale if no files for a specific
Locale have been found. Default is "true"; if this is turned off, the only
fallback will be the default file (e.g. "messages.properties" for
basename "messages").

Falling back to the system Locale is the default behavior of
java.util.ResourceBundle. However, this is often not
desirable in an application server environment, where the system Locale
is not relevant to the application at all: Set this flag to "false"
in such a scenario.

setCacheSeconds

public void setCacheSeconds(int cacheSeconds)

Set the number of seconds to cache loaded properties files.

Default is "-1", indicating to cache forever (just like
java.util.ResourceBundle).

A positive number will cache loaded properties files for the given
number of seconds. This is essentially the interval between refresh checks.
Note that a refresh attempt will first check the last-modified timestamp
of the file before actually reloading it; so if files don't change, this
interval can be set rather low, as refresh attempts will not actually reload.

A value of "0" will check the last-modified timestamp of the file on
every message access. Do not use this in a production environment!

setResourceLoader

The default is a DefaultResourceLoader. Will get overridden by the
ApplicationContext if running in a context, as it implements the
ResourceLoaderAware interface. Can be manually overridden when
running outside of an ApplicationContext.

refreshProperties

Refresh the PropertiesHolder for the given bundle filename.
The holder can be null if not cached before, or a timed-out cache entry
(potentially getting re-validated against the current last-modified timestamp).