通过spring上下文获取本地已经加载的所有FeignName
有时候需要知道客户端引入使用了多少feignclient,方便统计服务对外请求,因此需要扫描本地feignClient的服务名
实现
实现逻辑很简单,借用spring上下文对象获取所有带有@FeignClient的bean。然后解析bean名称。规则是固定的,可以通过@EnableFeignClient实现源码查到具体规则,然后通过env是用来解析用户有时会把feign的name写成配置文件属性,因此需要借用这个工具来获取对应配置属性
@Autowired
private ApplicationContext applicationContext;
@Autowired
private Environment environment;
public static final String FEIGN_CLIENT_SPECIF = ".FeignClientSpecification";
public static final String FEIGN_CLIENT_DEFAULT = "default.";
public static final String FEIGN_CLIENT_SPEL_START_CHAR = "${";
public static final String FEIGN_CLIENT_SPEL_END_CHAR = "}";
private Map<String,String> stringStringMap = new HashMap<>();
@GetMapping("/test")
public void test() {
String[] names = applicationContext.getBeanDefinitionNames();
for (String name : names) {
if (name.contains(FEIGN_CLIENT_SPECIF) && !name.startsWith(FEIGN_CLIENT_DEFAULT)) {
String feignName = name.substring(0, name.indexOf(FEIGN_CLIENT_SPECIF));
if (feignName.startsWith(FEIGN_CLIENT_SPEL_START_CHAR)) {
String resolveFeignName = feignName.replace(FEIGN_CLIENT_SPEL_START_CHAR, "");
resolveFeignName = resolveFeignName.replace(FEIGN_CLIENT_SPEL_END_CHAR, "");
feignName = environment.getProperty(resolveFeignName);
}
log.info("获取Bean名称:【{}】", feignName);
stringStringMap.put(feignName.toUpperCase(),feignName);
}
}
stringStringMap.forEach((key,val)->{
log.info("最终解析出来的数据有,key:【{}】,value:【{}】",key,val);
});
}