带有默认值和多个覆盖的弹簧配置bean



我正在构建一个弹簧启动应用程序,该应用程序有理由呼吁多个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设置配置,但是似乎没有一种方法来参数它使用的密钥。尤其不是基于豆名称。我很想避免编写大量的样板来创建关键名称并从PropertyResolver或其他手动方法中获取。

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

当我们有类似的要求时,我们不是在代码上使用单个@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 ;
    //...
}

最新更新