SpringBoot自定义配置实现与解析

​ 在Spring Boot项目中我们有着默认的配置文件application.properties或者是是application.yml,可以进行封装出来的属性进行配置。有的时候我们需要根据不同的环境进行不同的配置。这里Spring Boot也提供了Spring.profiles.active来进行我们不同环境配置的选择,如application-{profile}.properties或者application-{profile}.yml。profile可以是我们的环境变量,如比较常见的dev,test等。

​ 此外,Spring Boot也提供了很多我们自定义配置或者自定义配置文件的方法,然后在统一通过它的自动装配来进行实现和管理。这里通过官方文档的介绍然后举几个比较常见使用的例子。

单属性配置

通过@Value注解我们可以在一些需要提取到配置文件进行赋值操作。从而避免了对业务代码进行修改。

如我们创建一个测试类,然后对基本属性使用@Value注解进行测试。

同时在application.yml文件中,对name进行我们的配置。

name: "CryFace"

然后在Spring Boot启动的时候就可以发现,我们的参与业务的name是有获取到配置的值并进行到容器的初始化里面。

然后如果这里的某个属性是要去获取当前环境的系统变量的时候,这里也可以进行设置。这样写法一般用于我们部署的时候去获取当前的系统变量(如端口之类等),如下我以我当前的JDK的环境变量进行测试。如果找不到就输出我们默认的CryFace。(这里对application.yml文件进行修改)

name: ${JAVA_HOME:CryFace}

配置类+主配置文件

虽然说我们可以对一些属性进行外部化的配置,但是东一个属性,西一个属性,不仅影响我们的项目整体可观性,而且也很麻烦。所以我们一般将同一类需要配置的属性放到一个类里面,让强类型bean管理和验证应用程序的配置。(这里我们在原来的name属性情况下,额外添加一个age和phone属性便于演示。)

然后在application.yml文件中进行配置。

my:
  name: "CryFace"
  age: 22
  phone: "156xxxxxxxx"

但是我们在运行的时候,出现了意外,我们配置的值并没有进行注入。

这里官网也给了详细的说明:

也就是说像这样安排依赖于默认的空构造函数,getter和setter通常是必需。而不是像我们的@Value那样,直接注入。这是因为我们通过第二种这样的绑定是通过标准的javabean属性描述符进行的。

所以这里我们加上getter和setrer之后之后就可以成功运行了。当然,我们在上面引用的时候是直接引用的,这里只加一个setter就可以运行!

我们还可以在该配置类下,定义静态类,然后在我们配置文件中生成三级目录配置。

my:
  name: "CryFace"
  age: 22
  phone: "156xxxxxxxx"
  extra:
    address: "Beijing"
    hobbies: ["basketball","football"]

运行测试:

配置类+自定义配置文件

当然,有的时候你不想在application文件进行配置或者想单独创建一份配置,这里也可以重新创建一个配置文件。

properties

这里如果是properties文件的话,我们按照properties的写法在文件进行配置,然后在我们配置类上面通过注解引入。

my.name="CryFace"
my.age=22
my.phone="156xxxxxxxx"
my.extra.address="Beijing"
my.extra.hobbies=["basketball","football"]

yml

如果是我们yml配置文件的话,我们不需要通过注解来引入文件,而是要到我们application.yml文件中去引入。

spring:
  profiles:
    include: test2

而且我们的配置文件也有了比较严格的命名要求,必须是application-xxx.yml了。我们可以在profiles的两个参数来进行配置文件的管理。

active代表我们目前激活在哪个配置文件中,如果不进行设置默认就是当前的application.yml。include可以引入我们当前所激活的配置文件还需要引入的配置文件。举个例子:

application-dev.yml文件中

spring:
  profiles:
    include: devRedis,devES,devRocketMQ

application-test.yml文件中

spring:
  profiles:
    include: testRedis,testES,testRocketMQ

我们在application中通过active选择dev还是test的时候,就相当于同时选择了这些对应的yml配置文件。

参考资料

[1] https://docs.spring.io/spring-boot/docs/2.4.4/reference/htmlsingle/#boot-features-external-config

posted @ 2021-04-12 18:02  CryFace  阅读(644)  评论(0编辑  收藏  举报