zoukankan      html  css  js  c++  java
  • 运行期调整System property内容

    出于一些特殊需求,比如需要运行期修改三方依赖的配置(第三方无法配合,或者拒绝配合),需要一种方案可以在第三方类在其静态块加载属性前修改系统属性,使得支持运行期动态调整。

    目前项目基于springboot2.x,但基于的原理1.x也可以支持。细节如下:

    springboot启动后,会驱动到SpringApplication的run方法。

    在这里有一个非常重要的listener:SpringApplicationRunListener,其支持在各种生命周期阶段得到回调通知。

    包括:

    contextLoaded

    上下文已加载,未初始化

    contextPrepared

    上下文已创建并准备完成,未初始化

    environmentPrepared

    环境准备完成

    failed

    应用启动失败

    running

    上下文刷新完成,CommandLineRunners&ApplicationRunners已经被调用完成,在整个应用启动完成前执行

    started

    上下文刷新完成,应用已启动,但是CommandLineRunners&ApplicationRunners未被调用

    starting

    启动器开始执行时,环境,上下文等都尚未开始

    在environmentPrepared阶段,会通知配置的listener准备环境属性装载。其通过ApplicationEnvironmentPreparedEvent事件通知到ConfigFileApplicationListener进行属性的装载。处理environmentPrepared的是EventPublishingRunListener,如果想在这个阶段从environment中读取配置内容替换System.property,需要设置合适的order顺序,避免在EventPublishingRunListener前执行导致获取的environment未装载。

    有这个基础了,可以自行基于SpringApplicationRunListener实现一个listener,然后实现指定的阶段自定义逻辑即可。该listener的初始化依赖spring的factories机制,做好相应的配置即可。

    一些场景比如:

    部分第三方jar配置硬编码优先从System.property中读取配置属性,而这部分代码的配置希望跟随业务的配置文件一起使用,不希望因此调整启动脚本导致配置散落各处最终维护困难。

    整合第三方框架时,第三方配置的加载方式与内部的方式差别太大,希望在不改变其行为的基础上融入现有体系。

  • 相关阅读:
    PHP(Zend Studio)入门视频
    PHP开发工具
    ggplot2 pdf import in Adobe Illustrator missing font AdobePiStd
    Python逐行读取文件内容
    R语言合并data.frame
    shell删除最后一列、删除第一行、比较文件
    C语言的fopen函数(文件操作/读写)
    Android 必须知道2018年流行的框架库及开发语言,看这一篇就够了!
    谈谈你对Glide和Picasso他们的对比的优缺点
    Google推荐——Glide使用详解(图片加载框架)
  • 原文地址:https://www.cnblogs.com/asfeixue/p/14274030.html
Copyright © 2011-2022 走看看