springboot启动修改注解属性值

Java代码实现:在springboot启动时,feignclient接口上的注解@feignclient修改name属性值

img

注解的值只能定义常量。。

  • 看下这篇博客,也许你就懂了,链接:springboot 使用 feign
  • 除此之外, 这篇博客: spring boot Spring使用FeignClient组件中的 思路2:自定义类似@FeignClient注解 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • [强烈推荐-可完全参考]在纯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接口实例化一个其对象,来调用。这种方式可以用来也可以用来单元测试。

  • 以下回答由chatgpt基于相关博客总结生成:

    我可以通过以下步骤来在springboot启动时,通过Java代码修改feignclient接口上的注解@FeignClient中的name属性值:

    1. 首先,需要在启动类上添加@EnableFeignClients注解以开启Feign调用,并指定basePackages来扫描@FeignClient注解标注的FeignClient接口。
    @EnableFeignClients(basePackages = "com.example.demo")
    @SpringBootApplication
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    
    1. 创建一个FeignClient扫描器,用于获取所有使用@FeignClient注解的接口,然后修改其中的name属性值。
    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();
                    }
                }
            }
        }
    
    }
    
    1. 在启动类的@Bean的方法中注入FeignClientRegistrar,用于修改@FeignClient中的name属性值。
    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属性值了。