前言

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=valuefirst.second.third=value

示例:

  1. 定义属性:
key=valuegame.name=GTA5

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

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

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

  1. 定义 Map:
game.map.key1=value1game.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: valuefirst:  second:    third: value

示例:

  1. 定义属性:
key: valuegame:  name: GTA5
  1. 定义 List:
game:  list:    - GTA5    - NBA2K    - AC
  1. 定义 Map:
game:  map:    key1: value1    key2: value2
  1. 援用已定义的属性:
game:  name: GTA5great:  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@Componentpublic 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")@RestControllerpublic class DemoController {    @Autowired    private DemoCustomConfig demoCustomConfig;    @GetMapping("/getCustomValue")    public ResponseEntity<String> getCustomValue() {        return ResponseEntity.ok(demoCustomConfig.getAuthor() + "说:" + demoCustomConfig.getDescription());    }}

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

@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")@RestControllerpublic class DemoController {    @Autowired    private SystemCustomConfig systemCustomConfig;    @GetMapping("/getSystemVersion")    public ResponseEntity<String> getSystemVersion() {        return ResponseEntity.ok(systemCustomConfig.getName() + "版本:" + systemCustomConfig.getVersion());    }}

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

对于主动提醒

不过,目前有个问题就是,咱们本人写了个 Java Bean 后,在配置文件中写配置项的时候并没有相干提醒,这个就比拟不敌对,如果当咱们本人写的配置想要给其他人用的话,他人都不晓得有什么配置能够配。所以想要能像 Spring Boot 提供的配置提醒一样的话,就须要引入上面的依赖:

<!-- 配置文件处理器,配置文件进行绑定就会有提醒 --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-configuration-processor</artifactId>    <optional>true</optional></dependency>
spring-boot-configuration-processor 是一个用于生成配置元数据的注解处理器。它会扫描应用 @ConfigurationProperties 注解的类和办法,来获取配置参数并生成配置元数据。生成的配置元数据能够用于 IDE 的主动补全和提醒性能。

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

对于 Cannot resolve configuration property

对于咱们自定义的配置,会呈现这样的提醒:Cannot resolve configuration property(无奈解决自定义的配置属性),如下:

解决形式就是定义一下元数据,用元数据来形容这个属性。当咱们挪动到这个配置项上时,呈现提醒,咱们间接点击 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,接着从新编译整个我的项目,就能够了。于此同时,也具备了主动提醒性能。

自定义配置文件

下面说的是自定义的配置,当初这里说自定义的配置文件,咱们晓得 Spring Boot 默认提供 application.properties 这个配置文件。那当初咱们想本人写一个配置文件,并且能在利用中读取这个配置文件的信息,该如何做呢?这里就波及到 @PropertySource 这个注解了。

自定义的配置文件:

custom.yml

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

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

@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 来指定获取该自定义配置文件的信息。

最初的最初

心愿各位屏幕前的靓仔靓女们给个三连!你轻轻地点了个赞,那将在我的心里世界削减一颗亮堂而夺目的星!

咱们下期再见!