我有一项使用许多外部服务的服务。我正在为每个属性创建属性文件,这些属性文件很少,例如twil.props,tweet.props,hubpot.props等。
为了在运行时获得这些特性,我正在使用PropertiesLoaderUtils,如下所示:
Resource resource = new ClassPathResource("/"+apiname +".properties");
Properties props = PropertiesLoaderUtils.loadProperties(resource);
我想像ConfigurationProperties一样将这些属性添加到POJO中,为此我设计了以下POJO:
public class APIConfig {
private Integer paginationPerPage;
private String paginationKeyword;
private String paginationStyle;
private String countParamKeyword;
private String countKey;
private String offsetKey;
}
我将以这种方式维护属性文件,以便可以轻松将它们映射到Config POJO:
twil.properties的属性
api.paginationPerPage=10
api.paginationKeyword=limit
api.paginationStyle=offset
api.countParamKeyword=count
api.countKey=count
api.offsetKey=offset
那么我可以利用Spring Boot / Spring实用程序,config等将其直接添加到给定的POJO中吗?
最佳答案
正如评论中所注意到的,这里唯一正确的解决方案包括零停机时间,即@RefreshScope
。
使用Spring Cloud配置依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
添加到您的代码
@Configuration
class SomeConfiguration {
@Bean
@RefreshScope
@ConfigurationProperties("twil.props")
APIConfig twilConfig() {
return new ApiConfig()
}
@Bean
@RefreshScope
@ConfigurationProperties("tweet.props")
APIConfig tweetConfig() {
return new ApiConfig()
}
}
用法:
@Autowire APIConfig tweetConfig;
到任何bean调用
/refresh
端点以通过属性源中的新值刷新bean请使解决方案与Spring生态系统统一。
如果要动态依赖,例如,
@PathVariable
:private Map<String, AppConfig> sourceToConfig;
@GetMapping("/{source}/foo")
public void baz(@PathVariable source) {
AppConfig revelantConfig = sourceToConfig.get(source);
...
}
Spring提供了自动收集bean映射的机会,其中bean key是bean名称。
将上面的Bean方法从
twilConfig
重命名为twil()
并像这样调用您的端点:/twil/foo
(twilConfig是端点的错误路径)