首页 > 其他分享 >springboot 动态获取配置信息完成启动

springboot 动态获取配置信息完成启动

时间:2023-02-08 17:46:17浏览次数:42  
标签:argList run springboot args class 获取 add 动态 port

架构说设计到数据量较大的应用要从k8s中迁出单独机器部署

于是将8节点的服务准备迁出,且端口号在数据库中保存

在不引入springcloud的方式下 启动spring容器中对args进行配置属性注入

思路一 通过spring容器获取信息

    public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
        //WebApplicationType.NONE 获取bean信息
        SpringApplication build = new SpringApplicationBuilder(Application.class).web(WebApplicationType.NONE).build(args);
        ConfigurableApplicationContext run = build.run();
        ConfigurableEnvironment environment = run.getEnvironment();
        //模拟获取到的端口号
        AA bean = run.getBean(AA.class);
        int port = bena.port();
        //关闭spring 不然会提示重复导致启动失败
        run.close();
        List<String> argList;
        if (args != null) {
            argList = new ArrayList<>(Arrays.asList(args));
        } else {
            argList = new ArrayList<>();
        }
        argList.add("--Dserver.port=6999");
        //起作用的行--
        argList.add("--server.port=6998");
        argList.add("-Dserver.port=6997");
        argList.add("-server.port=6996");
        argList.add("Dserver.port=6995");
        argList.add("server.port=6994");
        System.out.println("-------------------------------------------------------------------------");
        SpringApplication.run(Application.class, argList.toArray(new String[0]));
    }

思路二 非spring容器获取

   public static void main(String[] args) {
       //通过静态方法,jdbc连接方式获取 配置信息然后写入args实现动态配置
       SpringApplication.run(Application.class,args);
   }

额外的知识点

修改final属性的字段值

MutablePropertySources propertySources = environment.getPropertySources();
for (PropertySource<?> propertySource : propertySources) {
    Object source = propertySource.getSource();
    if (source instanceof Map) {
        //source 是一个只读map
        Object o = Map.class.cast(source).get("server.port");
        if (o == null) {
            continue;
        }
        if (o instanceof OriginTrackedValue) {
            OriginTrackedValue cast = OriginTrackedValue.class.cast(o);
            Field value = OriginTrackedValue.class.getDeclaredField("value");
            //value字段 是final 修饰的               
            //需要去掉modifiers中的Final
            Field modifiers = Field.class.getDeclaredField("modifiers");
            modifiers.setAccessible(true);
            modifiers.setInt(value, modifiers.getModifiers() & ~Modifier.FINAL);
            value.setAccessible(true);
            value.set(cast, bean.port());
        }
    }
}

标签:argList,run,springboot,args,class,获取,add,动态,port
From: https://www.cnblogs.com/zzzz-yh/p/17102588.html

相关文章