我有一项使用许多外部服务的服务。我正在为每个属性创建属性文件,这些属性文件很少,例如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是端点的错误路径)

09-05 15:29