Java代码实现:在springboot启动时,2.2.6版本的openfeign的feignclient接口上的注解@feignclient修改name属性值
时间: 2023-10-19 17:22:18 浏览: 273
可以通过实现`FeignClientBuilderCustomizer`接口来实现在启动时修改`@FeignClient`注解的`name`属性值。
实现类示例:
```java
import org.springframework.cloud.openfeign.FeignClientBuilder;
import org.springframework.cloud.openfeign.annotation.FeignClient;
import org.springframework.cloud.openfeign.support.SpringMvcContract;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignClientCustomConfig implements FeignClientBuilderCustomizer {
@Override
public void customize(FeignClientBuilder builder) {
// 获取所有的FeignClient接口
builder.build().getFeignContext().getInstances().forEach((name, feignClient) -> {
// 判断是否有@FeignClient注解
if (feignClient.getTarget() != null && feignClient.getTarget().getClass().isAnnotationPresent(FeignClient.class)) {
FeignClient feignClientAnnotation = feignClient.getTarget().getClass().getAnnotation(FeignClient.class);
// 判断注解中的name属性是否需要修改
if ("original-name".equals(feignClientAnnotation.name())) {
// 修改name属性值
FeignClient modifiedFeignClientAnnotation = new FeignClient() {
@Override
public Class<? extends Annotation> annotationType() {
return FeignClient.class;
}
@Override
public String name() {
return "modified-name";
}
@Override
public String qualifier() {
return feignClientAnnotation.qualifier();
}
@Override
public String url() {
return feignClientAnnotation.url();
}
@Override
public boolean decode404() {
return feignClientAnnotation.decode404();
}
@Override
public Class<?>[] configuration() {
return feignClientAnnotation.configuration();
}
@Override
public Class<?> fallback() {
return feignClientAnnotation.fallback();
}
@Override
public Class<?> fallbackFactory() {
return feignClientAnnotation.fallbackFactory();
}
@Override
public boolean primary() {
return feignClientAnnotation.primary();
}
@Override
public String contextId() {
return feignClientAnnotation.contextId();
}
@Override
public boolean inheritParentContext() {
return feignClientAnnotation.inheritParentContext();
}
@Override
public boolean defaultConfiguration() {
return feignClientAnnotation.defaultConfiguration();
}
@Override
public Class<? extends Contract> contract() {
return SpringMvcContract.class;
}
@Override
public String[] path() {
return feignClientAnnotation.path();
}
};
// 修改注解的value属性值
ReflectionUtils.setField(ReflectionUtils.findField(feignClient.getTarget().getClass(), "val$feignClient"), feignClient.getTarget(), modifiedFeignClientAnnotation);
}
}
});
}
}
```
在该实现类中,重写了`customize`方法,在该方法中获取所有的`FeignClient`接口并遍历,判断是否有`@FeignClient`注解,如果有则判断注解中的`name`属性是否需要修改,如果需要则创建一个新的注解实例并修改`name`属性值,最后通过反射修改原来的`@FeignClient`注解实例中的`value`属性值。
注意:由于`@FeignClient`注解中的`name`属性是被`value`属性覆盖的,所以这里修改的是`value`属性值而不是`name`属性值。
阅读全文