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