Spring Boot 读取配置文件的几种方式

06-01 1823阅读

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


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

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

  1. 命令行参数(如:--server.port=8081)
  2. application.properties / application.yml(位于 classpath:/config/)
  3. classpath:/application.properties 或 application.yml
  4. 外部配置中心(如 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
              path: /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 servers;
            // Map 示例
            private Map metadata;
            // Map 示例
            private Map 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 支持友好

          ❌ 缺点:

          Spring Boot 读取配置文件的几种方式
          (图片来源网络,侵删)
          • 需要额外的类定义

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

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

            示例代码:

            Spring Boot 读取配置文件的几种方式
            (图片来源网络,侵删)
            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();
                }
                @RequestMapping("/printConfig")
                public void printConfig() {
                    appConfigProperties.print();
                }
                @RequestMapping("/printEnv")
                public void printEnv() {
                    String name = env.getProperty("app.name");
                    System.out.println("app.name = " + name);
                }
            }
            

            ✅ 优点:

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

              ❌ 缺点:

              Spring Boot 读取配置文件的几种方式
              (图片来源网络,侵删)
              • 可读性差,不支持自动绑定

                方式四:加载自定义配置文件(@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() {
                        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
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码