Java代码实现:在springboot启动时,feignclient接口上的注解@feignclient修改name属性值
注解的值只能定义常量。。
[强烈推荐-可完全参考]在纯Spring环境中使用Feign来进行声明式HTTP调用
参考URL: jianshu.com/p/48ba120641fb
之前,公司使用spring cloud,记得使用@feign http访问其它微服务非常好用。但是传统的spring项目如何使用该组件呢?
这里的传统 Spring项目指的是没有使用 spring boot的 spring项目,例如 ssm。
经过网上信息分析总结,Spring 不能像我们在spring boot中那样很直接的使用
@FeignClient的接口运行时都会生成代理类,由代理类去调用远程服务。
如果想spring boot中那样,使用注解,业务直接注入那种方式使用,在Spring环境下,我们还需要做一些工作。
否则查看官方demo https://github.com/OpenFeign/feign
类似如下,这个 Feign.builder()这种,在使用时实例化你的feign接口实例化一个其对象,来调用。这种方式可以用来也可以用来单元测试。
我可以通过以下步骤来在springboot启动时,通过Java代码修改feignclient接口上的注解@FeignClient中的name属性值:
@EnableFeignClients(basePackages = "com.example.demo")
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
import java.util.Map;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.util.StringUtils;
public class FeignClientRegistrar implements BeanFactoryPostProcessor {
private final Map<String, String> clientMap;
public FeignClientRegistrar(Map<String, String> clientMap) {
this.clientMap = clientMap;
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
String[] beanNames = beanFactory.getBeanDefinitionNames();
for (String beanName : beanNames) {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
String beanClassName = beanDefinition.getBeanClassName();
if (beanClassName != null) {
try {
Class<?> clazz = Class.forName(beanClassName);
FeignClient feignClient = AnnotationUtils.findAnnotation(clazz, FeignClient.class);
if (feignClient != null) {
String name = feignClient.name();
if (clientMap.containsKey(name)) {
// 修改name属性值为clientMap中对应的值
String newName = clientMap.get(name);
if (StringUtils.hasText(newName)) {
beanDefinition.getPropertyValues().add("name", newName);
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
}
import java.util.HashMap;
import java.util.Map;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableFeignClients(basePackages = "com.example.demo")
public class FeignConfig {
@Bean
public FeignClientRegistrar feignClientRegistrar() {
Map<String, String> clientMap = new HashMap<>();
clientMap.put("USER-CLIENT", "NEW-USER-CLIENT"); // 将name属性值为USER-CLIENT的接口修改为NEW-USER-CLIENT
return new FeignClientRegistrar(clientMap);
}
}
通过以上步骤,就可以在springboot启动时通过Java代码修改feignclient接口上的注解@FeignClient中的name属性值了。