开发者

Spring Boot读取配置文件的五种方式小结

目录
  • 1. 配置文件位置与加载顺序
  • 2. 读取配置文件的方式汇总
    • 方式一:使用 @Value 注解读取配置
    • 方式二:使用 @ConfigurationProperties 自动绑定配置类(推荐)
    • 方式三:http://www.devze.com使用 Environment 编程式读取配置
    • 方式四:加载自定义配置文件(@PropertySource)
    • 方式五:多环境配置(多 Profile)
  • 总结

    Spring Boot 提供了灵活多样的方式来读取配置文件(如 application.yml 或 application.properties),本文介绍几种常见的读取方式。

    1. 配置文件位置与加载顺序

    Spring Boot 默认从以下位置加载配置文件(优先级从高到低):

    命令行参数(如:--server.port=8081)

    application.properties / application.yml(位于 classpath:/config/)

    classpath:/application.properties 或 application.yml

    外部配置中心(如 Nacos、Spring Cloud Config)

    2. 读取配置文件的方式汇总

    Spring Boot 提供了多种读取配置文件的方式。

    方式一:使用 @Value 注解读取配置

    这种方式适合读取单个简单配置项。可以用来注入配置文件中的值,也可以指定默认值,防止配置项缺失时抛出异常 。

    配置文件:

    app:
      name: order-v
      version: v1
    

    示例代码:

    @Component
    public class AppProperties {
    
        @Value("${app.name:order}")
        private String name;
    
        @Value("${app.version:v1.0.0}")
        private String version;
    
        public void print() {
            System.out.println("App Name: " + name);
            System.out.println("App Version: " + version);
        }
    }
    
    • : 后面就是默认值
    • 当配置文件中没有对应的值时,会使用默认值
    • 如果配置项存在对应的值,默认值不生效

    测试代码:

    @RestController
    @RequestMapping("/test")
    @AllArgsConstructor
    public class TestController {
    
        private final AppProperties appProperties;
    
        @RequestMapping("/print")
        public void print() {
            appProperties.print();
        }
    }
    

    ✅ 优点:

    简单直接,适用于读取单个变量

    ❌ 缺点:

    不支持嵌套结构、不支持批量绑定、不利于维护

    方式二:使用 @ConfigurationProperties 自动绑定配置类(推荐)

    适合绑定多个字段、嵌套结构、List、Map等复杂配置。

    配置文件:

    app:
      name: order-v
      version: v1
      servers:
        - http://dev-server:8080
        - http://test-server:8081
        - http://prod-server:8082
      metadata:
        author: Alice
        version: 1.0.2
        website: https://emp.com
      modules:
        user:
          enabled: true
          path: /user
        admin:
          enabled: false
          pyElssdbath: /admin

    配置类示例代码:

    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    import Java.util.List;
    import java.util.Map;
    
    @Component
    @ConfigurationProperties(prefix = "app")
    @Data
    public class AppProperties {
    
        private String name;
    
        // List 示例
        private List<String> servers;
    
        // Map<String, String> 示例
        private Map<String, String> metadata;
    
        // Map<String, 自定义对象> 示例
        private Map<String, Module> modules;
    
        @Data
        public static class Module {
            private boolean enabled;
            private String path;
        }
        
        public void print() {
            System.out.println("name: " + name);
            System.out.println("servers: " + servers);
            System.out.println("metadata: " + metadata);
            System.out.println("modules: " + modules);
        }
    }
    

    使用示例:

    import com.example.xiaoshitou.config.AppConfigProperties;
    import com.example.xiaoshitou.config.AppProperties;
    import lombok.AllArgsConstructor;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    
    @RestController
    @RequestMapping("/test")
    @AllArgsConstructor
    public class TestController {
    
        private final AppProperties appProperties;
        private final AppConfigProperties appConfigProperties;
    
        @RequestMapping("/print")
        public void print() {
            appProperties.print();
        }
    
        @RequestMapping("/printConfig")
        public void printConfig() {
            appConfigProperties.print();
        }
    }
    

    ✅ 优点:

    • 支持对象结构、嵌套对象、List、Map
    • 支持校验(配合 @Validated)
    • 强类型绑定,IDE 支持友好

    ❌ 缺点:

    需要额外的类定义

    方式三:使用 Environment 编程式读取配置

    适合动态读取、条件判断场景。

    示例代码:

    import com.example.xiaoshitou.config.AppConfigProperties;
    import com.example.xiaoshitou.config.AppProperties;
    import com.example.xiaoshitou.config.SmsConfig;
    import lombok.AllArgsConstructor;
    import org.springframework.core.env.Environment;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /***
     * @title
     * @author shijiangyong
     * @date 2025/4/24 17:28
     **/
    @RestController
    @RequestMapping("/test")
    @AllArgsConstructor
    public class TestController {
    
        private final AppProperties appProperties;
        private final AppConfigProperties appConfigProperties;
        private final Environment env;
    
        @RequestMapping("/print")
        public void print() {
            appProperties.print();
        }
    
        @RequestMjavascriptapping("/printConfig")
        public void printConfig() {
            appConfigProperties.print();
        }
    
        @RequestMapping("/printEnv")
        public void printEnv() {
            String name = env.getProperty("app.name");
            System.out.println("app.name = " + name);
        }
    
    }
    

    ✅ 优点:

    • 动态、灵活,支持条件判断
    • 可用于第三方库或工具类中

    ❌ 缺点:

    可读性差,不支持自动绑定

    方式四:加载自定义配置文件(@PropertySource)

    当你需要读取非 application.yml 的配置文件时使用。

    自定义配置文件 sms-config.properties:

    sms.sign=aliyun
    sms.template.code=TPL001
    

    示例代码:

    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    
    /***
     * @title
     * @author shijiangyong
     * @date 2025/4/25 10:08
     **/
    @Configuration
    @PropertySource("classpath:sms-config.properties")
    @ConfigurationProperties(prefix = "sms")
    @Data
    public class SmsConfig {
        private String sign;
        private Template template;
    
        @Data
        public static class Template {
            private String code;
        }
    
        public void print() www.devze.com{
            System.out.println("sign : " + sign);
            System.out.println("template.code : " + template.getCode());
        }
    }
    

    使用示例:

    import com.example.xiaoshitou.config.AppConfigProperties;
    import com.example.xiaoshitou.config.AppProperties;
    import com.example编程.xiaoshitou.config.SmsConfig;
    import lombok.AllArgsConstructor;
    import org.springframework.core.env.Environment;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /***
     * @title
     * @author shijiangyong
     * @date 2025/4/24 17:28
     **/
    @RestController
    @RequestMapping("/test")
    @AllArgsConstructor
    public class TestController {
    
        private final AppProperties appProperties;
        private final AppConfigProperties appConfigProperties;
        private final SmsConfig smsConfig;
        private final Environment env;
    
        @RequestMapping("/print")
        public void print() {
            appProperties.print();
        }
    
        @RequestMapping("/printConfig")
        public void printConfig() {
            appConfigProperties.print();
        }
    
        @RequestMapping("/printEnv")
        public void printEnv() {
            String name = env.getProperty("app.name");
            System.out.println("app.name = " + name);
        }
    
    
        @RequestMapping("/smsConfig")
        public void smsConfig() {
            smsConfig.print();
        }
    
    }
    

    ✅ 优点:

    • 支持加载自定义配置文件
    • 可与 @ConfigurationProperties 搭配使用

    ❌ 缺点:

    • 不支持 .yml 格式
    • 不支持动态刷新

    方式五:多环境配置(多 Profile)

    适用于开发、测试、生产环境的配置隔离。

    配置文件:

    # application-dev.yml
    app:
      name: DevApp
    
    # application-prod.yml
    app:
      name: ProdApp
    

    激活方式:

    在 application.yml 中设置:

    spring:
      profiles:
        active: dev
    

    或通过启动参数:

    --spring.profiles.active=prod
    

    ✅ 优点:

    • 多环境隔离,配置清晰
    • 支持组合激活多个 profile

    总结

    场景推荐方式
    读取单个简单值@Value
    读取嵌套结构、对象@ConfigurationProperties
    动态读取Environment
    非默认配置文件@PropertySource
    多环境支持多 profile

    以上就是Spring Boot读取配置文件的五种方式小结的详细内容,更多关于Spring Boot读取配置文件的资料请关注编程客栈(www.devze.com)其它相关文章!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜