【第五篇】 SpringBoot中的高级配置
简介
本文介绍了SpringBoot项目中的高级配置技巧,包括:1. 临时属性设置方法;2. 配置文件的4级分类及优先级规则;3. 自定义配置文件的两种实现方式;4. 多环境开发的3种实现方案。重点讲解了不同配置的优先级关系、加载顺序以及实际应用场景,还提供了配置分组、环境切换等实用技巧,帮助开发者更好地管理项目配置,提高开发效率。文章内容若存在错误或需改进的地方,欢迎大家指正!若对操作有任何疑问欢迎留言!非常感谢!
目录
一、设置临时属性
1、SpringBoot工程属性生效的优先级
2、命令行参数设置临时属性
3、IDEA下测试临时属性
(1)设置启动参数
(2)编程环境中设置启动参数
二、配置文件4级分类
注意
1、一级配置文件
2、二级配置文件
3、三级配置文件
4、四级配置文件
5、四种等级配置文件的作用
三、自定义配置文件
四、配置文件实现多环境开发
1、yaml单配置文件实现
2、多文件实现
(1)yaml文件实现
(2)properties文件实现
3、多环境开发独立配置文件书写技巧
4、多环境开发控制
一、设置临时属性
1、SpringBoot工程属性生效的优先级
【Spring官网连接】Spring Boot 使用特定的 PropertySource
顺序,允许合理覆盖值:后加载的属性源可以覆盖先加载的属性源中的值。
从上往下优先级逐渐升高,优先级高的配置能覆盖优先级低的配置。
属性源顺序如下:
1、默认属性(通过 SpringApplication.setDefaultProperties(Map)
设置)。
2、@Configuration
类上的 @PropertySource
注解。注意:此类属性源直到应用上下文刷新时才会添加到 Environment 中,因此无法用于配置某些提前读取的属性(如 logging.*
和 spring.main.*
)。
3、配置数据(如 application.properties
文件)。
4、RandomValuePropertySource
(仅包含 random.*
属性)。
5、操作系统环境变量。
6、Java 系统属性(System.getProperties()
)。
7、JNDI 属性(来自 java:comp/env
)。
8、ServletContext 初始化参数。
9、ServletConfig 初始化参数。
10、SPRING_APPLICATION_JSON
中的属性(嵌入在环境变量或系统属性中的内联 JSON)。
11、命令行参数。
12、测试中的 properties
属性(适用于 @SpringBootTest
和测试特定应用切片的注解)。
13、测试中的 @DynamicPropertySource
注解。
14、测试中的 @TestPropertySource
注解。
15、激活 DevTools 时,$HOME/.config/spring-boot
目录中的全局设置属性。
2、命令行参数设置临时属性
通过Maven将SpringBoot程序打成jar包之后,然后在Windows环境下启动,需要在jar包所在路径下运行“java -jar xxxx.jar”,如果此时需要设置临时属性,那么只需要在命令的后面拼接“--临时属性”即可,临时命令的书写格式参照application文件的格式。若需要多个临时属性,那么就依次拼接即可。
以修改启动端口号为9999为例:
3、IDEA下测试临时属性
(1)设置启动参数
在IDEA的右上角进行修改项目启动参数,可以IDEA版本不一样,这个页面的按钮的位置不一样,但是最终页面的效果是一样的。
然后在Edit Configuration Settings页面的Program arguments中配置需要的临时属性,格式为“--临时属性”,临时命令的书写格式参照application文件的格式。若需要多个临时属性,那么就依次拼接即可。
若没有Program arguments框,可以点击Modify options然后勾选即可。
测试
(2)编程环境中设置启动参数
先还是在Program arguments框中配置一个“--server.port=9999”的参数,然后打印一下启动类的args参数。可以看到这个参数就是用于接收所配置的临时属性的,那么这样的话就可以在编程的时候向args数组中添加需要的临时属性。或者直接创建一个数组,然后里面设置一些属性,并将数组作为参数传递给run方法作为参数,一样可以实现效果。
测试之前需要先把Program arguments框中设置的临时属性删除,然后再向数组中添加数据,并传递给run方法。
若是在开发中,run方法是可以只接收一个参数的,可以不接收数组参数,如果不希望用户在外面通过临时属性覆盖程序配置的话,可以不接收这个参数,可以提高程序的安全性。
二、配置文件4级分类
注意
配置文件级别越高,加载的时机越晚。若优先级高的配置文件与优先级低的配置文件的内容有冲突的话,最终会保留优先级高的配置文件的配置,而二者没有冲突的部分则最终会共存。
同等级下的配置文件页可区分properties、yml、yaml等文件,不同的文件名后缀也同样具有优先级:properties>yml>yaml
下面的说明将只以yaml文件为例
1、一级配置文件
一级配置文件是优先级最低的文件,也就是创建工程时默认在resources目录下的配置文件。
2、二级配置文件
在默认的resources目录下创建一个config目录,然后在config目录里面再创建一个application.yaml配置文件,这个配置文件就是二级配置文件。
3、三级配置文件
将SpringBoot工程通过Maven打成jar包,然后在与jar包同层的目录下新建一个application.yaml配置文件,这个配置文件就是三级配置文件,就算工程中已经有了默认resources下的配置文件、config目录下的配置文件,这个配置文件的优先级依旧比前两者高。这个文件中也只配置了端口号为7777,可以运行一下jar包,看一下启动端口号。
4、四级配置文件
在与jar包同层的目录下创建一个config目录,然后在config目录里面再创建一个application.yaml配置文件,这个配置文件就是四级配置文件,这个配置文件优先级最高。这个文件中只配置了端口号为6666,当四个配置文件同时存在的时候,可以运行一下jar包,看一下启动端口号。
5、四种等级配置文件的作用
一般场景
- 1级服务于开发人员做本机开发与测试
- 2级服务于项目经理整体调控
- 3级服务于运维人员配置涉密线上环境
- 4级服务于运维经理整体调控
三、自定义配置文件
在项目中,不论那种等级的配置文件目前使用的文件名都是application,其实这个文件名称也是可以更改的。以一级配置文件为例,将application文件名改为demo。然后启动项目,可以看到默认是不生效的。
(1)使用临时属性指定文件名令配置文件生效
在Edit Configuration Settings页面的Program arguments中配置“--spring.config.name=自定义文件名”临时属性,然后启动项目即可看到配置文件成功生效。
(2)使用临时属性指定配置文件路径令配置文件生效
在Edit Configuration Settings页面的Program arguments中配置“--spring.config.location=classpath:/全自定义文件名”临时属性,然后启动项目即可看到配置文件成功生效。支持一次配置多个文件逗号分隔即可“--spring.config.location=classpath:/全自定义文件名,classpath:/全自定义文件名,... ...”。若指定了多个文件,多个文件中有相同的配置,那么后面的文件会覆盖前面的文件,不同的配置则会共存。
四、配置文件实现多环境开发
1、yaml单配置文件实现
可以自行搜索一下yaml文件多文档模式,简单来说就是在yaml可以使用“---”作为分割符,然后一个“---”符号分割的就代表一个文档,这里的yaml配置文件实现多环境开发也就是用的这个特性,在yaml文件中使用多文档配置不同的属性,然后在指定使用哪个即可。最上面的成为主配置,主要配置一些公共配置,其余文档配置冲突属性。
可以使用spring.profiles只不过现在显示过时了,可以使用spring.config.activate.on-profile代替。
2、多文件实现
(1)yaml文件实现
单个文件实现会让文件内容变得及其繁琐,而且还不好维护,所以多文件模式就解决了这个问题。只需要新建application-环境名.yaml即可,然后在主文件主配置需要使用的文档。
(2)properties文件实现
properties文件多环境配置仅支持多文件格式。
单个文件实现会让文件内容变得及其繁琐,而且还不好维护,所以多文件模式就解决了这个问题。只需要新建application-环境名.properties即可,然后在主文件主配置需要使用的文档。
3、多环境开发独立配置文件书写技巧
使用功能对配置文件中的信息进行拆分,并制作成独立的配置文件,例如:
- 数据库相关配置:application-devDB.yaml
- 缓存相关配置:application-devRedis.yaml
- MVC相关配置:application-devMVC.yaml
使用技巧
示例前提:dev环境启动时需要依赖devDB和devMVC配置文件、pro环境启动时需要依赖proDB和proMVC配置文件、test环境启动时需要依赖testDB和testMVC配置文件。
(1)单文件使用
在使用激活环境的情况下,使用include属性配置多个环境,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔。在控制台可以看到同时加载的环境,这个顺序是有意义的,主环境配置,这里也是dev永远都是最后一个加载的,前面的都是按照include的顺序加载,若有相同的配置,主配置会覆盖其他配置,其他配置的话会后加载的配置文件会覆盖前配置文件。
(2)多文件使用
在上面的单文件使用中,如果需要需要在dev、pro、test环境之间频繁切换的话,include也需要跟着变动,假如include属性很多,那么就造成了一些维护成本,并且出问题的几率太高了,于是在SpringBoot2.4版本开始就出现了多文件的使用技巧,更加的便于维护。
多文件使用其实就是使用group属性替代include属性,使用group属性定义多种主环境与子环境的包含关系,将所有需要include的配置进行分组,然后需要哪个分组直接引用哪个分组即可,降低了配置的书写量。
有一点需要注意:就是多文件使用的时候的加载顺序发生了改变,主配置永远第一个,其他配置文件为group设置的顺序若有相同的配置,主配置会覆盖其他配置,其他配置的话会后加载的配置文件会覆盖前配置文件。
4、多环境开发控制
多环境开发不仅可以在SpringBoot的配置文件中设置,还可以在Maven设置,而因为SpringBoot时依赖Maven而存在的,所以是以Maven的配置优先。
使用技巧是,在Maven的pom文件中配置以下的配置,然后在配置文件中使用两个“@”符号进行引用,引用的内容是在Maven的properties属性中自定义的属性名称,然后使用Maven进行打包,打包成功之后可以解压一下jar包或者直看jar包,在BOOT-INF目录下的classes目录下有配置文件,然后查看配置文件内容,就被成替换了。
问题
在项目中可能会有一种情况就是更换activation属性之后,然后进行Maven的打包,发现打完包的配置文件中调用的内容并没有发生改变,这个时候只需要执行以下Maven的compile一下,然后再打包就没有这个问题了。