• Spring Boot 配置文件总结


    前言

    Spring Boot 中提供一个全局的配置文件:application.properties,这个配置文件的作用就是,允许我们通过这个配置文件去修改 Spring Boot 自动配置的默认值

    Spring Boot 支持两种格式的配置文件:application.propertiesapplication.yml

    yml 等同于 yaml,写法看个人喜欢,我喜欢写成 application.yml

    不同后缀不同写法

    application.propertiesapplication.yml ,它们的区别在于语法不同,但本质上是一样的。application.properties 使用键值对的方式来配置,而 application.yml 使用缩进和冒号的方式来配置。

    properties

    properties 作为后缀的配置文件,语法是这样的:key = value,如果有多级配置项,则是 first.second.third = value

    key=value
    first.second.third=value
    

    示例:

    1. 定义属性:
    key=value
    game.name=GTA5
    

    这里的 keygame.name 都是属性名称,而 valueGTA5 是属性的

    1. 定义 List:
    game.list=GTA5,NBA2K,AC
    

    这里的 game.list 这个列表包含了 3 个元素。

    1. 定义 Map:
    game.map.key1=value1
    game.map.key2=value2
    

    这里的 game.map 是一个 Map,这个 Map 包含了两个元素,key1 映射到 value1,key2 映射到 value2

    1. 引用已定义的属性:
    game.name=GTA5
    # 引用上面已定义的属性
    great.game=${game.name}
    

    yml (yaml)

    yml 作为后缀的配置文件,语法是这样的:key: value。使用冒号代替等号,同时冒号后面需要跟上一个空格符,不可省略。

    key: value
    first:
      second:
        third: value
    

    示例:

    1. 定义属性:
    key: value
    game:
      name: GTA5
    
    1. 定义 List:
    game:
      list:
        - GTA5
        - NBA2K
        - AC
    
    1. 定义 Map:
    game:
      map:
        key1: value1
        key2: value2
    
    1. 引用已定义的属性:
    game:
      name: GTA5
    great:
      game: @{game.name}
    

    不同环境下切换不同的配置文件

    一般项目中在不同环境下都有不同的配置,还是以这个 Tomcat 的端口号为例:

    目前有 3 个环境,分别是开发环境、测试环境、生产环境。在开发环境下,端口号是 4790;测试环境下,端口号是 4791;生产环境下是 4792。

    application-dev.yml

    server:
      port: 4790
    

    application-test.yml

    server:
      port: 4791
    

    application-prod.yml

    server:
      port: 4792
    

    spring.profiles.active

    现在,通过 spring.profiles.active 这个配置项,在 application.yml 中指定我们想要切换的配置文件,现在指定使用开发环境的配置文件

    # 指定使用 application-dev.yml 这个配置文件
    spring:
      profiles:
        active: dev
    

    启动 Spring Boot 应用,控制台输出:

    2023-03-16 15:41:48.122  INFO 3356 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 4790 (http) with context path ''
    

    指定使用测试环境下的配置文件

    # 指定使用 application-test.yml 这个配置文件
    spring:
      profiles:
        active: test
    

    启动 Spring Boot 应用,控制台输出:

    2023-03-16 15:42:21.462  INFO 24548 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 4791 (http) with context path ''
    

    同理,指定使用生产环境的配置文件也是一样的做法。

    自定义的配置

    在 Spring Boot 项目中,自定义配置是经常用到的,我目前体会到的自定义的配置的作用有一点:配置与代码解耦

    下面,我们看看如何自定义配置,并使用自己自定义配置的值:

    server:
      port: 4790
    
    # 自定义的配置
    demo:
      author: god23bin
      description: 点个免费的赞,我能开心好久!
    
    

    上面自定义了两个配置项,分别是 demo.authordemo.description,接着,如何在代码中使用这些配置好的值呢?

    目前使用这些配置好的值(读取这些值),有以下几种方式:

    • 使用 @Value
    • 使用 @ConfigurationProperties

    @Value

    我们写一个普通的 Java 类,使用 Spring 提供的 @Value 来读取这两个值:

    @Data
    @Component
    public class DemoCustomConfig {
    
        /**
         * 通过 @Value 注解读取配置文件中的自定义配置项的值,使用 ${} 进行读取
         **/
        @Value("${demo.author}")
        private String author;
    
        @Value("${demo.description}")
        private String description;
    
    }
    

    上面的代码中,我在类上使用了 @Data@Component@Data 是来自 Lombok 的,用于生成 getter 和 setter 方法,@Component 则将该类的实例对象交给 Spring 管理,接着在该类的两个属性上分别使用了 @Value 注解,通过 ${} 指定了我们要读取的配置项。

    进行测试,我们写一个 Controller 判断我们的读取是否成功:

    @RequestMapping("/demo")
    @RestController
    public class DemoController {
    
        @Autowired
        private DemoCustomConfig demoCustomConfig;
    
        @GetMapping("/getCustomValue")
        public ResponseEntity getCustomValue() {
            return ResponseEntity.ok(demoCustomConfig.getAuthor() + "说:" + demoCustomConfig.getDescription());
        }
    }
    

    访问该接口:localhost:4790/demo/getCustomValue

    image-20230321233256647

    @ConfigurationProperties

    @ConfigurationProperties 注解,它可以将配置文件中的的值绑定到 Java Bean 中,也就是通过这个 Bean 可以读取到配置文件中配置的值,我们看看如何操作。

    我们自定义一个用于读取配置文件中配置项的类:

    @Data
    @Component
    @ConfigurationProperties("system.demo")
    public class SystemCustomConfig {
    
        private String name;
    
        private String version;
    
    }
    

    上面的代码,主要使用了 @ConfigurationProperties 这个注解,并指定了前缀 system.demo,同时这个类有两个属性,name 和 version, 这样就相当于我们自定义了 system.demo.namesystem.demo.version 这两个属性。

    接着,我们就能在配置文件中写这两个我们自定义的配置项了:

    server:
      port: 4790
    
    # 自定义的配置
    system:
      demo:
        name: 超级系统
        version: 1.0
    

    写完这里的配置项,并不需要使用 @Value 去读取,因为使用了 @ConfigurationProperties 注解,Spring 已经帮我们搞定了配置的值的读取,至于它的实现原理,这里先不深究。

    进行测试,依然通过写一个接口来测试我们通过:

    @RequestMapping("/demo")
    @RestController
    public class DemoController {
    
        @Autowired
        private SystemCustomConfig systemCustomConfig;
    
        @GetMapping("/getSystemVersion")
        public ResponseEntity getSystemVersion() {
            return ResponseEntity.ok(systemCustomConfig.getName() + "版本:" + systemCustomConfig.getVersion());
        }
    }
    

    访问该接口:localhost:4790/demo/getSystemVersion

    image-20230321233317428

    关于自动提示

    不过,目前有个问题就是,我们自己写了个 Java Bean 后,在配置文件中写配置项的时候并没有相关提示,这个就比较不友好,如果当我们自己写的配置想要给其他人用的话,别人都不知道有什么配置可以配。所以想要能像 Spring Boot 提供的配置提示一样的话,就需要引入下面的依赖:

    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-configuration-processorartifactId>
        <optional>trueoptional>
    dependency>
    

    spring-boot-configuration-processor 是一个用于生成配置元数据的注解处理器。它会扫描使用 @ConfigurationProperties 注解的类和方法,来获取配置参数并生成配置元数据。生成的配置元数据可以用于 IDE 的自动补全和提示功能。

    image-20230322233941391

    如果你引入了这个依赖并且重启该 Spring Boot 项目后,依旧没有提示的话,尝试开启 IDEA 中的 annotaion processing

    image-20230322234341016

    关于 Cannot resolve configuration property

    对于我们自定义的配置,会出现这样的提示:Cannot resolve configuration property(无法处理自定义的配置属性),如下:

    image-20230322235035717

    解决方式就是定义一下元数据,用元数据来描述这个属性。当我们移动到这个配置项上时,出现提示,我们直接点击 Define configuration key xxx 就可以帮我们生成一个关于配置的元数据文件。

    additional-spring-configuration-metadata.json

    {
      "properties": [
        {
          "name": "demo.author",
          "type": "java.lang.String",
          "description": "Demo的作者"
        },
        {
          "name": "demo.description",
          "type": "java.lang.String",
          "description": "Demo的描述"
        }
      ]
    }
    

    此时,还是一样,重启项目,如果黄色提示还是没有去除的话,这里建议重新用 Maven 进行一次 clean,接着重新编译整个项目,就可以了。于此同时,也具有了自动提示功能。

    image-20230322235958525

    自定义配置文件

    上面说的是自定义的配置,现在这里说自定义的配置文件,我们知道 Spring Boot 默认提供 application.properties 这个配置文件。那现在我们想自己写一个配置文件,并且能在应用中读取这个配置文件的信息,该如何做呢?这里就涉及到 @PropertySource 这个注解了。

    自定义的配置文件:

    custom.yml

    # 自定义的配置文件
    version: 2.0
    description: 求关注!
    

    读取该配置文件的配置类:

    @Data
    @Configuration
    @PropertySource("classpath:custom.yml")
    public class DemoPropertiesSourceConfig {
    
        @Value("${version}")
        private String version;
    
        @Value("${description}")
        private String description;
    
    }
    

    这样,就能读取到自己编写的配置文件的配置信息了。

    如果有多个自定义的配置文件,那么可以使用 @PropertySources 注解,可以看到最后面多加了一个 s ,说明这个单词是复数,通俗易懂。

    @Configuration
    @PropertySources({
        @PropertySource("classpath:custom1.yml"),
        @PropertySource("classpath:custom2.properties")
    })
    public class MyConfig {
        // ...
    }
    

    总结

    1. 配置文件的两种写法:properties 和 yml

    2. 项目中存在多个配置文件,可以使用 spring.profiles.active 属性来切换使用哪个配置文件。

    3. 自定义的一些配置属性(配置项),如何读取呢?可以在程序中通过 @Value 或者@ConfigurationProperties 来读取。

    4. 自定义的配置文件,可以通过 @PropertySource 来指定获取该自定义配置文件的信息。

    最后的最后

    希望各位屏幕前的靓仔靓女们给个三连!你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!

    咱们下期再见!

  • 相关阅读:
    第五十四章 学习常用技能 - 生成测试数据
    【RS】遥感影像/图片64位、16位(64bit、16bit)的意义和区别
    Oracle Linux ISO 全系列下载地址
    【零基础学Python】后端开发篇 第二十一节--Python Web开发二:Django的安装和运行
    数据结构-顺序表操作
    PMP考试倒计时,速看3A通关锦囊!
    larvel 中的api.php_Laravel 开发 API
    让孩子更快乐的学编程,一套积木就够了,长毛象AI百变编程积木套件体验
    Java包装类和泛型
    云原生网关哪家强:Sealos 网关血泪史
  • 原文地址:https://www.cnblogs.com/god23bin/p/spring-boot-configuration-file.html