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,特别是当配置项较多或有关联时,这样代码更清晰、易于维护。

相关推荐
lkbhua莱克瓦24几秒前
进阶-SQL优化
java·数据库·sql·mysql·oracle
用户26851612107564 分钟前
GMP 调度器深度学习笔记
后端·go
行稳方能走远8 分钟前
Android java 学习笔记 1
android·java
kaico20189 分钟前
多线程与微服务下的事务
java·微服务·架构
zhglhy9 分钟前
QLExpress Java动态脚本引擎使用指南
java
小瓦码J码11 分钟前
使用AWS SDK实现S3桶策略配置
java
廋到被风吹走14 分钟前
【Spring】Spring Cloud 配置中心动态刷新与 @RefreshScope 深度原理
java·spring·spring cloud
J_liaty14 分钟前
SpringBoot深度解析i18n国际化:配置文件+数据库动态实现(简/繁/英)
spring boot·后端·i18n
牧小七15 分钟前
springboot 配置访问上传图片
java·spring boot·后端
用户268516121075619 分钟前
GMP 三大核心结构体字段详解
后端·go