Skip to content

Spring Boot 基于 BeanPostProcessor + Redis 轻量级属性动态配置

分布式系统中,动态配置管理常依赖 Nacos、Spring Cloud Config,Apollo 等配置中心,但引入独立中间件会显著增加运维成本和架构复杂度。为平衡功能需求与系统轻量化,本方案基于 Redis 发布订阅机制与 BeanPostProcessor 扩展点,实现了一套零外部依赖的动态配置更新体系。

核心实现

  1. 核心机制 利用 BeanPostProcessor 在 Bean 初始化阶段拦截 @DynamicValue 注解,将动态属性键与 Bean 属性的建立绑定关系。

  2. 动态更新 通过 Redis 的 Pub/Sub 模块监听配置变更事件,实时反射更新内存中已绑定的 Bean 属性值,实现秒级生效的无缝热更新。

核心代码说明

dynamic

  • @DynamicValue,用于 Spring 扫描 Bean 对象的时候,可以直接管理这些配置了自定义注解的类的属性, value 的格式 (key:defaultValue)
  • DynamicValueBeanFactory 实现了 BeanPostProcessor,这样我们就可以拿到 Spring 所有实例化后的 Bean 对象。Spring 是扫描你所工程下所有的 Bean 对象,加载到它的容器里管理。postProcessAfterInitialization 扫描所有的 Bean 对象,之后检查哪个类的属性加有 @DynamicValue 注解,检测到后进行管理操作。

使用

  1. 引入依赖
xml
        <dependency>
            <groupId>com.ssn.boot</groupId>
            <artifactId>spring-boot-starter-dynamic-config</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
  1. 需要动态配置的地方,添加自定义注解
java
@RestController
@RequestMapping("dynamic")
public class DynamicController {

    @DynamicValue("group:dm")
    private String group;

    @Autowired
    private RTopic dynamicTopic;

    @GetMapping("config")
    public String getGroup() {
        return group;
    }


    @GetMapping("{key}/{value}")
    public String updateGroup(@PathVariable String key,@PathVariable String value) {
        dynamicTopic.publish(key + DynamicConstants.SPLIT + value);
        return group;
    }

}
  1. yml 添加相关配置
yml
dynamic:
  config:
    enable: true
    host: redis://127.0.0.1:6379
    namespace: test
server:
  port: 8999

测试

  1. 开始访问, 默认返回 dm
  2. 访问修改配置的接口,key = group, dm = dm222
  3. 再次访问,返回 dm222, 说明动态属性配置生效了

Released under the MIT License.