spring-cloud-openfeign-core包下提供了FeignClientBuilder類,可以在不使用@FeignClient注解的情況下手動生成FeignClient
public class FeignClientCreateUtils {
//緩存已經生成的FeignClient
private static Map<String, Object> cacheFeignClient = new ConcurrentHashMap<>();
private static FeignClientBuilder builder;
public static <T> T getFeignClient(Integer systemId, Class<T> clazz) {
SystemInfoDto systemInfo = ErpSystemBrandUtils.getSystemInfo(systemId);
FeignClient feignClient = clazz.getAnnotation(FeignClient.class);
//先從緩存查找
if (cacheFeignClient.containsKey(systemInfo.getSystemNameEn() + feignClient.contextId())) {
return (T) cacheFeignClient.get(systemInfo.getSystemNameEn() + feignClient.contextId());
}
FeignClientBuilder.Builder<T> erpFeignClient = builder.forType(clazz, systemInfo.getSystemNameEn().toLowerCase());
T feign = erpFeignClient.contextId(feignClient.contextId()).path(feignClient.path()).build();
cacheFeignClient.put(systemInfo.getSystemNameEn() + feignClient.contextId(), feign);
return feign;
}
/**
* 通過spring applicationContext生成builder
* @param applicationContext
*/
public static void init(ApplicationContext applicationContext) {
if (null == builder) {
builder = new FeignClientBuilder(applicationContext);
}
}
}