如何将Feign注解硬编码属性值提取到properties配置文件
实现方案
Spring 系列注解原生支持${配置项key}占位符语法读取配置文件内容,不需要额外做复杂改造,分两步操作即可:
1. 在application.properties中定义所有抽离的配置项
把原来硬编码的服务名、请求根地址、鉴权appId全部抽到配置文件里,方便后续统一修改维护:
# 汇率服务Feign客户端配置 exchange.service.name=open-exchange exchange.service.base-url=https://openexchangerates.org/api # 汇率接口鉴权参数 exchange.service.app-id=9968744ca3284c3baf5d09cf1815ae6b
2. 修改Feign接口,用占位符替换硬编码值
直接在注解属性里用${配置key}引用上面定义的配置即可,Spring启动时会自动把占位符替换成配置文件里的实际值:
@FeignClient(name = "${exchange.service.name}", url = "${exchange.service.base-url}") public interface CurrencyRatesServiceProxy { @GetMapping("/latest.json?app_id=${exchange.service.app-id}") CurrencyRatesBean retrieveLatestCurrencyRates(); @GetMapping("/historical/{date}.json?app_id=${exchange.service.app-id}") CurrencyRatesBean retrieveCurrencyRatesByDate(@PathVariable String date); }
如果你项目用的是application.yml配置文件,只需要把上述properties配置改成yml对应格式即可,注解里的占位符写法完全通用。
优化实践(可选)
上述写法已经满足配置统一管理的需求,如果要进一步降低重复代码维护成本,可以把每个接口都重复拼接的app_id参数抽成全局逻辑:
- 自定义Feign请求拦截器,统一给所有该客户端的请求追加app_id查询参数
@Component public class ExchangeRateAuthInterceptor implements RequestInterceptor { @Value("${exchange.service.app-id}") private String appId; @Override public void apply(RequestTemplate template) { template.query("app_id", appId); } }
- 简化Feign接口的路径写法,去掉重复拼接的app_id参数
@FeignClient(name = "${exchange.service.name}", url = "${exchange.service.base-url}") public interface CurrencyRatesServiceProxy { @GetMapping("/latest.json") CurrencyRatesBean retrieveLatestCurrencyRates(); @GetMapping("/historical/{date}.json") CurrencyRatesBean retrieveCurrencyRatesByDate(@PathVariable String date); }
后续如果鉴权规则调整,只需要修改拦截器逻辑,不需要逐个接口改动。
内容的提问来源于stack exchange,提问作者alex_us
相关产品推荐
相关产品推荐

