springboot的controller中如何拿到applicatim.yml的配置值

在Spring Boot的Controller中获取application.yml配置值,主要有以下几种方式:

1. 使用 @Value注解(最常用)

application.yml 配置

复制代码
app:
  name: "我的应用"
  version: "1.0.0"
  max-users: 100
  enabled: true
  timeout: 30000

Controller 中使用

复制代码
@RestController
@RequestMapping("/api")
public class ConfigController {
    
    @Value("${app.name}")
    private String appName;
    
    @Value("${app.version}")
    private String appVersion;
    
    @Value("${app.max-users}")
    private int maxUsers;
    
    @Value("${app.enabled}")
    private boolean enabled;
    
    @Value("${app.timeout}")
    private long timeout;
    
    @GetMapping("/config")
    public Map<String, Object> getConfig() {
        Map<String, Object> config = new HashMap<>();
        config.put("name", appName);
        config.put("version", appVersion);
        config.put("maxUsers", maxUsers);
        config.put("enabled", enabled);
        config.put("timeout", timeout);
        return config;
    }
}

2. 使用 @ConfigurationProperties(推荐用于复杂配置)

创建配置类

复制代码
@Configuration
@ConfigurationProperties(prefix = "app")
@Data
public class AppConfig {
    private String name;
    private String version;
    private int maxUsers;
    private boolean enabled;
    private long timeout;
    private List<String> whitelist;
    private Map<String, String> endpoints;
}

在Controller中注入使用

复制代码
@RestController
@RequestMapping("/api")
public class ConfigController {
    
    @Autowired
    private AppConfig appConfig;
    
    @GetMapping("/config")
    public AppConfig getConfig() {
        return appConfig;
    }
    
    @GetMapping("/info")
    public String getAppInfo() {
        return appConfig.getName() + " v" + appConfig.getVersion();
    }
}

3. 使用 Environment接口

复制代码
@RestController
@RequestMapping("/api")
public class ConfigController {
    
    @Autowired
    private Environment environment;
    
    @GetMapping("/env-config")
    public Map<String, Object> getEnvConfig() {
        Map<String, Object> config = new HashMap<>();
        config.put("name", environment.getProperty("app.name"));
        config.put("version", environment.getProperty("app.version"));
        config.put("maxUsers", environment.getProperty("app.max-users", Integer.class));
        config.put("timeout", environment.getProperty("app.timeout", Long.class, 5000L));
        
        return config;
    }
}

4. 复杂配置示例

application.yml

复制代码
app:
  name: "用户管理系统"
  version: "2.1.0"
  database:
    url: "jdbc:mysql://localhost:3306/mydb"
    username: "admin"
    pool-size: 20
  security:
    jwt-secret: "my-secret-key"
    token-expire: 3600
    cors-origins:
      - "http://localhost:3000"
      - "https://example.com"
  features:
    enable-cache: true
    enable-notification: false

对应的配置类

复制代码
@Configuration
@ConfigurationProperties(prefix = "app")
@Data
public class AppConfig {
    private String name;
    private String version;
    private DatabaseConfig database;
    private SecurityConfig security;
    private FeaturesConfig features;
    
    @Data
    public static class DatabaseConfig {
        private String url;
        private String username;
        private int poolSize;
    }
    
    @Data
    public static class SecurityConfig {
        private String jwtSecret;
        private int tokenExpire;
        private List<String> corsOrigins;
    }
    
    @Data
    public static class FeaturesConfig {
        private boolean enableCache;
        private boolean enableNotification;
    }
}

Controller中使用

复制代码
@RestController
@RequestMapping("/api")
public class SystemController {
    
    @Autowired
    private AppConfig appConfig;
    
    @GetMapping("/system-info")
    public Map<String, Object> getSystemInfo() {
        return Map.of(
            "appName", appConfig.getName(),
            "databaseUrl", appConfig.getDatabase().getUrl(),
            "corsOrigins", appConfig.getSecurity().getCorsOrigins(),
            "enableCache", appConfig.getFeatures().isEnableCache()
        );
    }
}

5. 带默认值的配置

复制代码
@RestController
@RequestMapping("/api")
public class ConfigController {
    
    // 使用默认值
    @Value("${app.unknown-property:default-value}")
    private String unknownProperty;
    
    @Value("${app.retry-count:3}")
    private int retryCount;
    
    @GetMapping("/default-values")
    public Map<String, Object> getWithDefaults() {
        return Map.of(
            "unknownProperty", unknownProperty,
            "retryCount", retryCount
        );
    }
}

主要区别和选择建议

方式 适用场景 优点 缺点
@Value 简单的单个配置项 简单直接 配置分散,不易管理
@ConfigurationProperties 复杂的配置组 类型安全,集中管理 需要创建配置类
Environment 动态获取配置 灵活,可动态获取 类型转换需要手动处理

推荐使用 @ConfigurationProperties,特别是当配置项较多或有关联时,这样代码更清晰、易于维护。

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!2 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
俊昭喜喜里2 天前
java中的继承和多态的区别
java
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕2 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码2 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖2 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时2 天前
01-06-A-JVM排查实战详解
java·jvm