欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Springboot 实现启动后动态修改配置

程序员文章站 2022-03-14 10:20:30
...

以SpringCloud 为例,希望服务在启动后根据某些信息生成一个动态的 实例ID

也就是application.yaml中配置的如Eureka的配置

eureka:
  instance:
    instance-id: ID

我们如果希望在服务启动时候随机生成一个instance-id,首先找到

可以使用BeanPostProcessor在Bean实例化之后对他进行修改eureka.instance这个属性绑定到的Bean,通过在application.yaml 按住Ctril + 左键点击可以找到org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean
Springboot 实现启动后动态修改配置

接下在使用后处理器在实例化之后对属性进行调整即可

@Component
public class EurekaConfigBeanPostProcessor implements BeanPostProcessor  {
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof EurekaInstanceConfigBean) {
            EurekaInstanceConfigBean properties = (EurekaInstanceConfigBean) bean;
            String instanceId = properties.getInstanceId();
            System.out.println("Old InstanceID:      " + instanceId);
            instanceId =  UUID.randomUUID().toString();
            // 修改ID
            properties.setInstanceId(instanceId);
        }
        return null;
    }
}

这样在注册中心我们就可以看见我们自定义的ID。

这里主要是找到配置文件中对应配置的Config对象。

下面是SpringCloud consul动态修改实例ID的示例,Consul的配置实例为org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties类:

@Component
public class ConsulConfigPostProcessorDemo implements BeanPostProcessor  {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof ConsulDiscoveryProperties) {
            
            ConsulDiscoveryProperties properties = (ConsulDiscoveryProperties) bean;
            String instanceId = properties.getInstanceId();
            System.out.println("InstanceID:      " + instanceId);
            instanceId += "__MODIFY";
            properties.setInstanceId(instanceId);
        }
        return null;
    }
}

参考

[1]. 萧逸才 . Spring的BeanPostProcessor接口实现Demo . https://blog.csdn.net/xyc_csdn/article/details/77427724