You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Spring Configuration Properties优雅动态读取多配置类(非Spring应用)

非Spring应用下优雅使用Spring Configuration Properties管理多配置类

方案核心思路

将配置类与Spring上下文配置解耦,通过统一的配置上下文管理所有配置类,同时封装工具类简化配置读取,既利用Spring Configuration Properties的强大映射能力,又无需将整个应用转为Spring应用。

步骤1:重构单一职责的配置类

每个配置类仅保留@ConfigurationProperties注解,移除@Configuration、@PropertySource及内部配置类,专注于属性映射:

package org.oval.ddi.ws.config;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "ws.remote", ignoreInvalidFields = true)
public class Account {
    private String remoteServiceUrl;
    private String wsAction;
    private String logAction;
    private String apiId;
    private String type;
    private int outTime;
    private String wsSpaceNameRemote;
    private String query;
    private String log;

    // 所有getter、setter方法保持不变,此处省略
}

如果后续新增配置类(如OrderConfig),只需按照相同模式编写:

package org.oval.ddi.ws.config;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "ws.order", ignoreInvalidFields = true)
public class OrderConfig {
    private String orderServiceUrl;
    private String orderTopic;

    // getter、setter方法
}

步骤2:创建统一配置上下文

单独编写一个配置类,集中配置属性源并启用所有配置类,新增配置类时仅需在此处添加:

package org.oval.ddi.ws.config;

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource(encoding="UTF-8", value = "classpath:DDIConfig.properties", ignoreResourceNotFound = true)
// 新增配置类时,直接追加到注解参数列表
@EnableConfigurationProperties({Account.class, OrderConfig.class})
public class AppConfigContext {
}

步骤3:封装配置读取工具类

编写工具类初始化Spring上下文并提供配置获取接口,避免重复创建上下文,同时支持动态刷新:

package org.oval.ddi.ws.utils;

import org.oval.ddi.ws.config.Account;
import org.oval.ddi.ws.config.AppConfigContext;
import org.oval.ddi.ws.config.OrderConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class ConfigLoader {
    private static final AnnotationConfigApplicationContext context;

    static {
        // 仅初始化一次上下文
        context = new AnnotationConfigApplicationContext(AppConfigContext.class);
        context.registerShutdownHook(); // 程序退出时自动关闭上下文
    }

    public static Account getAccountConfig() {
        return context.getBean(Account.class);
    }

    public static OrderConfig getOrderConfig() {
        return context.getBean(OrderConfig.class);
    }

    // 动态刷新配置(修改属性文件后调用)
    public static void refreshConfig() {
        context.refresh();
    }
}

步骤4:使用示例

在业务代码中直接调用工具类获取配置,无需关心Spring上下文细节:

public class TestConfig {
    public static void main(String[] args) {
        // 获取Account配置
        Account account = ConfigLoader.getAccountConfig();
        System.out.println(account.getRemoteServiceUrl());

        // 获取OrderConfig配置
        OrderConfig orderConfig = ConfigLoader.getOrderConfig();
        System.out.println(orderConfig.getOrderServiceUrl());

        // 修改属性文件后,调用刷新方法重新加载配置
        ConfigLoader.refreshConfig();
    }
}

方案优势

  • 职责清晰:配置类仅处理属性映射,上下文配置集中管理,代码结构更整洁
  • 易于扩展:新增配置类只需两步——编写映射类、在AppConfigContext中注册
  • 性能优化:Spring上下文仅初始化一次,避免重复创建开销
  • 支持动态刷新:通过refreshConfig方法可实现配置的动态更新

内容的提问来源于stack exchange,提问作者hachi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:15:07