重新加载Spring的MessageSource
Spring的MessageSource可以读取属性文件并获取消息。
如果更改属性文件,只需重新启动应用程序即可在MessageSource中反映出来。我尝试了一下在应用程序已启动的情况下是否可以加载。
总结
ResourceBundleMessageSource、ReloadableResourceBundleMessageSourceのどちらを利用しても再読込させることが可能
どちらのクラスもキャッシュの生存期間を指定でき、その期間超えた場合はファイルを再読込する
ただし、任意のタイミングで再読込したいならReloadableResourceBundleMessageSourceを使うべし
关于每个MessageSource
资源束消息源
您可以使用Java的ResourceBundle来从属性文件中获取消息。
您可以指定缓存的生存期,如果超过该期限,将重新加载属性文件。
然而,没有提供手动删除缓存的方法。
可重装的资源束消息源
虽然被命名为ResourceBundle,但这里并未使用Java的ResourceBundle,而是在Spring的一侧开发了自己的消息获取处理等功能。
同时,您也可以指定缓存的存活时间。
此外,由于存在清除缓存的方法,您可以在任意时刻销毁缓存。
此外,在此类中,您不仅可以读取属性文件,还可以读取XML文件。
以上只是一些額外的話題
在Java5之前,似乎没有ResourceBundle具有控制缓存的功能。
因此,在那个时候,似乎只能通过ReloadableResourceBundleMessageSource进行重新加载。
确认
环境
-
- Spring Boot 2.0.6.RELEASE (SpringFramework 5.0.10.RELEASE)
- Java8
项目准备
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
创建消息定义文件
创建属性文件。
hoge=hogehoge
为了确认重新加载,这些文件将放置在Spring Boot项目之外。
(我将它们存放在E:\test中。)
其他
将MessageSource定义为Bean。
@Bean
MessageSource resourceBundleMessageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.addBasenames("message");
messageSource.setCacheSeconds(10);
return messageSource;
}
@Bean
MessageSource reloadableResourceBundleMessageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.addBasenames("classpath:message");
return messageSource;
}
我将ResourceBundleMessageSource的缓存过期时间设置为10秒。
由于没有设置ReloadableResourceBundleMessageSource,因此默认值为-1,始终使用缓存。
此外,在从类路径中获取时,必须在beasename中添加classpath:前缀。
以下是用于确认动作的控制器的样子。
@RestController
public class MessageController {
@Autowired
@Qualifier("resourceBundleMessageSource")
MessageSource resourceBundleMessageSource;
@Autowired
@Qualifier("reloadableResourceBundleMessageSource")
MessageSource reloadableResourceBundleMessageSource;
@GetMapping("/")
public Map<String, String> index() {
Map<String, String> map = new HashMap<>();
map.put("resouceBundleMessageSource:hoge",
resourceBundleMessageSource.getMessage("hoge", null, Locale.getDefault()));
map.put("reloadableResourceBundleMessageSource:hoge",
reloadableResourceBundleMessageSource.getMessage("hoge", null, Locale.getDefault()));
return map;
}
@GetMapping("/clear-cache")
public Map<String, String> clearCache() {
((ReloadableResourceBundleMessageSource) reloadableResourceBundleMessageSource).clearCache();
return index();
}
}
确认动作
在启动时,需要将配置了属性文件的目录添加到类路径中。实际上,这是我查找的最耗时间的方法…
如果使用Spring Boot Maven插件,只需执行以下命令即可。
mvn spring-boot:run -Dspring-boot.run.folders="E:\test"
如果在pom.xml中而不是通过启动参数进行设置,则是以下的样子。 (Note: This paraphrase is in Traditional Chinese. Please let me know if you specifically want Simplified Chinese.)
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<folders>
<folder>E:\test</folder>
</folders>
</configuration>
</plugin>
对于可执行的JAR文件的情况……我打算将此话题单独作为另一篇文章,以免岔开。
在启动后,当访问 http://localhost:8080/ 时,会显示如下内容。
curl http://localhost:8080
{"reloadableResourceBundleMessageSource:hoge":"hogehoge","resouceBundleMessageSource:hoge":"hogehoge"}
应用程序在启动状态下编辑属性文件。
hoge=hogehoge!!!!
当再次访问http://localhost:8080/时,可以确认ResourceBundleMessageSource已经重新加载。
(需要经过前一次加载属性文件后,等待cacheSeconds设置的秒数已经过去。)
curl http://localhost:8080
{"reloadableResourceBundleMessageSource:hoge":"hogehoge","resouceBundleMessageSource:hoge":"hogehoge!!!!"}
可以通过访问http://localhost:8080/clear-cache来确认ReloadableResourceBundleMessageSource也会被重新加载。
curl http://localhost:8080/clear-cache
{"reloadableResourceBundleMessageSource:hoge":"hogehoge!!!!","resouceBundleMessageSource:hoge":"hogehoge!!!!"}
可以通过指定缓存的存活期限来重新加载文件,或者有意地销毁缓存并重新加载文件。