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

如何在静态final常量工具类中读取application.properties配置

解决方案

下面提供两种不影响原有引用的简便方案,核心思路是利用Spring的生命周期回调给静态变量赋值,保持原有类名.静态变量的访问方式不变:

方案一:实现EnvironmentAware接口

通过实现Spring的EnvironmentAware接口,在容器初始化时获取环境变量,直接给静态变量赋值:

import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class ConstantUtils implements EnvironmentAware {
    // 移除原有的final修饰符,保留static
    public static String API_BASE_URL;
    public static int MAX_RETRY_TIMES;

    @Override
    public void setEnvironment(Environment environment) {
        // 从application.properties读取配置,支持设置默认值
        API_BASE_URL = environment.getProperty("api.base.url");
        MAX_RETRY_TIMES = Integer.parseInt(environment.getProperty("max.retry.times", "3"));
    }
}

方案二:@PostConstruct配合@Value

把工具类声明为Spring Bean,用@Value注入配置到非静态成员变量,再通过@PostConstruct回调赋值给静态变量:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ConstantUtils {
    // 移除原有的final修饰符,保留static
    public static String API_BASE_URL;
    public static int MAX_RETRY_TIMES;

    // 用@Value注入配置到非静态成员变量
    @Value("${api.base.url}")
    private String apiBaseUrl;
    @Value("${max.retry.times:3}")
    private int maxRetryTimes;

    @PostConstruct
    public void initStaticConstants() {
        API_BASE_URL = this.apiBaseUrl;
        MAX_RETRY_TIMES = this.maxRetryTimes;
    }
}
注意事项
  • 必须移除原变量的final修饰符:final静态变量要求类加载时就确定值,而配置文件加载在Spring容器初始化阶段,晚于类加载,两者冲突。如果需要保证变量不可修改,可在赋值后通过代码逻辑限制,不过通常配置加载后不会变动,无需额外处理。
  • 工具类需被Spring扫描:添加@Component注解,确保Spring能识别并初始化这个Bean,否则回调方法不会执行。
  • 原有引用无需修改:项目中所有ConstantUtils.API_BASE_URL这类调用完全保持不变,不影响业务代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:07:20