由於這個post解釋,ReloadableResourceBundleMessageSource的refreshProperties方法可以重寫,以允許從classpath中的多個資源的加載和對應於給定模式
讓我們使用的大部分Spring boot defaults的舉個具體的例子:
public class BaseReloadableResourceBundleMessageSource extends ReloadableResourceBundleMessageSource
implements InitializingBean {
private static final String PROPERTIES_SUFFIX = ".properties";
private final PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
private final Charset encoding = Charset.forName("UTF-8");
@Autowired
private Environment environment;
/**
* Returns the resource bundle corresponding to the given locale.
*/
public Properties getResourceBundle(Locale locale) {
clearCacheIncludingAncestors();
return getMergedProperties(locale).getProperties();
}
@Override
public void afterPropertiesSet() {
setBasename("classpath*:/" + environment.getProperty("spring.messages.basename", "messages"));
setDefaultEncoding(environment.getProperty("spring.messages.encoding", encoding.name()));
setCacheSeconds(environment.getProperty("spring.messages.cache-seconds", int.class, -1));
setFallbackToSystemLocale(environment.getProperty("spring.messages.fallback-to-system-locale",
boolean.class, true));
}
@Override
protected PropertiesHolder refreshProperties(String filename, PropertiesHolder propHolder) {
final Properties properties = new Properties();
long lastModified = -1;
try {
for (Resource resource : resolver.getResources(filename + PROPERTIES_SUFFIX)) {
final PropertiesHolder holder = super.refreshProperties(cleanPath(resource), propHolder);
properties.putAll(holder.getProperties());
if (lastModified < resource.lastModified())
lastModified = resource.lastModified();
}
} catch (IOException ignored) {
// nothing to do
}
return new PropertiesHolder(properties, lastModified);
}
private String cleanPath(Resource resource) throws IOException {
return resource.getURI().toString().replace(PROPERTIES_SUFFIX, "");
}
}
爲什麼?根據當前用戶的區域設置加載正確的'messages.properties'。所以你正在嘗試已經自動完成... –
需要使用通配符,因爲我的應用程序是模塊化的,並且在這些模塊中定義了多個messages.properties。目前,只有一個被考慮在內。它看起來是最後一個被加載的。當前的實現假設我們已經在同一個文件中定義了所有的屬性。 –
這就是'ResourceBundle'的工作方式。 –