具有默认值和多个覆盖的Spring配置bean

时间:2016-06-15 20:04:00

标签: java spring spring-boot

我正在构建一个Spring Boot应用程序,它有理由调用多个HTTP服务。我希望能够为我的客户配置不同的选项,例如套接字超时,以及默认值。

理想情况下,我可以指定如下属性:

client.default.socket-timeout=500ms
client.slow-service.socket-timeout=1000ms # it's a bit slower
client.fast-service.socket-timeout=100ms

制作一个简单的类,如:

class ClientConfiguration {
    @Value("${client.<client-name>.socket-timeout:${client.default.socket-timeout:30}}")
    int socketTimeout;
}

然后能够注入:

@Inject
public MyService(@Named("slow-service") ClientConfiguration slowServiceConfig) { ... }

通常我通过@Value设置配置,但似乎没有办法对其使用的密钥进行参数化。特别是不基于bean名称。我希望避免编写大量的样板来创建关键名称并从PropertyResolver或其他手动方法中获取它。

Spring(4.3.0)或Spring Boot(1.4.0.M3)是否有任何良好的模式来解决这个用例?

1 个答案:

答案 0 :(得分:0)

当我们有类似的要求时,我们不是在整个代码中使用单独的@Value,而是为每组密钥创建了一个配置服务。

@Service
public class SlowClientConfigurationService {

    @Value("${client.slow.property.key}")
    private String slowValue;

    // getters, setters, sanity checks and so on...
}

并注入此服务,您需要慢速客户端配置,它可以通过getter / setters方法提供多个键值,并且还可以保持代码清洁。

@Service
public class YourService{

    @Autowire
    private SlowClientConfigurationService configurationService ;

    //...
}