重新加载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!!!!"}

可以通过指定缓存的存活期限来重新加载文件,或者有意地销毁缓存并重新加载文件。

广告
将在 10 秒后关闭
bannerAds