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

SpringBoot应用中@Value无法注入application.properties/application.yml配置值的问题

问题原因与解决方案

嘿,这个问题我之前也踩过坑!核心问题出在你用static修饰了baseUrl字段——Spring的@Value注解无法直接注入静态变量。

为什么会这样?

Spring的依赖注入是基于实例对象的,它会给容器中的每个bean实例注入依赖。而静态变量属于类本身,不属于任何实例对象,所以Spring容器没办法把配置值注入到静态字段里,这就是你看到输出NULL的原因。

几种可行的解决方案

方案1:去掉static,用实例变量配合启动回调(最推荐)

把baseUrl改成实例字段,然后让DemoApplication实现CommandLineRunner或者ApplicationRunner接口,在Spring启动完成后再打印配置值。这样既符合Spring的依赖注入规则,又能保证拿到正确的配置:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
    @Value("${application.baseurl}")
    public String baseUrl;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        // Spring启动完成后才会执行这里,此时baseUrl已经被注入
        System.out.println("Test Application baseUrl : " + baseUrl);
    }
}

方案2:保留静态变量,用非静态setter注入

如果你一定要用静态变量,可以添加一个非静态的setter方法,Spring会调用这个方法给静态变量赋值。注意要等Spring上下文初始化完成后再访问静态变量:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class DemoApplication {
    public static String baseUrl;

    // 非静态的setter方法,Spring会调用它注入值
    @Value("${application.baseurl}")
    public void setBaseUrl(String baseUrl) {
        DemoApplication.baseUrl = baseUrl;
    }

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);
        // 上下文初始化完成后再打印,此时静态变量已经被赋值
        System.out.println("Test Application baseUrl : " + baseUrl);
    }
}

方案3:使用@ConfigurationProperties绑定配置(适合复杂配置场景)

如果你的配置项比较多,推荐用@ConfigurationProperties来绑定整个配置前缀,这种方式更规范也更易维护:

首先创建一个配置类:

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

@Component
@ConfigurationProperties(prefix = "application")
public class AppConfig {
    private String baseurl;

    // getter和setter
    public String getBaseurl() {
        return baseurl;
    }

    public void setBaseurl(String baseurl) {
        this.baseurl = baseurl;
    }
}

然后在DemoApplication中注入这个配置类并使用:

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
    private final AppConfig appConfig;

    // 构造注入(Spring推荐的注入方式)
    public DemoApplication(AppConfig appConfig) {
        this.appConfig = appConfig;
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("Test Application baseUrl : " + appConfig.getBaseurl());
    }
}

小提示

尽量避免用静态变量存储Spring注入的配置,因为静态变量会增加代码耦合度,还会给单元测试带来麻烦。优先选择实例变量或者配置类的方式来管理配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:47:42