SpringBoot配置文件 application
一、比较配置文件Bootstrap和Application
SpringBoot中有两种配置文件:bootstrap(.yml或者.properties)和application(.yml或者.properties)他们的区别如下:
- **加载顺序:**Bootstrap是应用程序的 父 上下文,属于引导配置,由父ApplicationContext加载。Bootstrap优先于Application加载。
- **Bootstrap属性不可被覆盖:**Bootstrap中的属性不能被远程和本地相同配置覆盖。
- **Bootstrap不支持部分属性:**Bootstrap不支持部分属性,比如server.port就不会生效。
- **应用场景:**Bootstrap主要用于一些固定的、不能被覆盖的属性,以及加密解密场景。
- **共用环境:**Bootstrap和Application的上下文共用一个环境,他是所有Spring应用程序的外部属性的来源。
二、文件加载顺序
-
文件优先级越高,加载顺序越靠后。(加载顺越靠后文件优先级越高)
-
优先级高的属性值,会覆盖低的属性值。
例:.properties优先级高于.yml,则.yml文件优先于.properties被加载;
三、配置文件.properties和.yml的优先级
说明:该处的优先级不包含通过java -jar命令启动时手动添加参数的形式
--spring.config.localtion=
--spring.config.additional-location=
指定项目名称为 newDemo,下文中的项目根目录即为 newDemo目录(用 ./ 代替)
下面所有优先级有关的配置文件都只针对 同名 的配置文件: application.xxx
-
路径优先级:(越靠前优先级越高)
-
项目根目录下config目录(./config/)
-
项目根目录(./)
-
项目根目录下src目录下resource目录下config目录(./src/resource/config/)
-
项目根目录下src目录下resource目录下(./src/resource/)
官方说明样式: –file:./config/ –file:./ –classpath:/config/ –classpath:/ 优先级由高到底,高优先级的配置会覆盖低优先级的配置; SpringBoot会从这四个位置全部加载主配置文件,互补配置;
官方文档中说明:
-
-
文件优先级:Properties配置文件优先级高于yml配置文件
- properties
- yml
-
总结:
-
所谓优先级是指:在不同目录中存在多个同名配置文件,对于不同配置文件中的相同属性字段属性值的配置,那个配置文件的优先级越高,则这个字段的值就取那个配置文件中的值。
-
优先级顺序:
1、./config/application.properties(项目根目录中config目录下) 2、./config/application.yml 3、./application.properties(项目根目录下) 4、./application.yml 5、./src/resources/config/application.properties(项目resources目录中config目录下) 6、./src/resources/config/application.yml 7、./src/resources/application.properties(项目的resources目录下) 8、./src/resources/application.yml
-
-
图示:
四、spring.config.location命令行方式指定配置文件
**注:**SpringBoot会从上面四个位置全部加载主配置文件(application.xx),也就是说如果所有的文件配置了一样的信息,会进行覆盖,但是加载的时候会进行互补配置;可以使用高优先级配置覆盖低优先级配置的全部内容。
-
还可以在配置文件中通过spring.config.location来改变默认的配置文件位置
--spring.config.location=C:/application.properties --spring.config.location="C:/12 3/application.properties" (可以添加双引号来指定包含空格的文件路径)
-
这个配置只能用在命令行里,写在配置文件里是无效的,主要用来运维已经打包好了的程序,想要指定配置文件路径的情况;
-
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;
示例: java -jar aaa.jar --spring.config.location=C:/application.properties
-
-
–spring.config.location=C:/application.properties 配置的文件,它的优先级在哪里呢?
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置。
@@个人理解:优先级越高,加载顺序越靠后,所以下面文件加载顺序是从下往上,但是优先级是从上往下;
-
命令行参数
所有的配置都可以在命令行上进行指定 java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc 多个配置用空格分开; --配置项=值
-
来自java:comp/env的JNDI属性
-
Java系统属性(System.getProperties())
-
操作系统环境变量
例: ${JAVA_HOME}
-
*RandomValuePropertySource配置的random.属性值
RandomValuePropertySource对于注入随机值很有用(例如,注入秘密或测试用例)。 它可以产生整数、长整数、uuid或字符串。 my.secret=${random.value} my.number=${random.int} my.bignumber=${random.long} my.uuid=${random.uuid} my.number.less.than.ten=${random.int(10)} my.number.in.range=${random.int[1024,65536]}
==由jar包外向jar包内进行寻找;==(*.properties>*.yml) ==这里所谓的“spring.profile”指的是根据不同环境配置的配置文件 如:application-sit.yml、application-uat.yml就是带spring.profile的
-
jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
这个等级的配置文件指的是通过命令指定的外部的类似于下面的文件: application-sit.yml application-uat.yml 相对于application-uat.yml文件,application.yml会优先加载,所以uat中的属性会覆盖application.yml中的属性值;
-
jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
这个等级的配置文件指的是通过主配置文件中active或include指定的类似于下面的文件: 通过配置文件: spring.profiles.active=sit spring.profiles.include=sit,uat application-sit.yml application-uat.yml 通过命令: --spring.profiles.active=sit --spring.profiles.include=sit,uat
-
–spring.config.location=C:/application.properties(它在这里)
在使用 spring.config.location 指定外部配置文件时,需要此份配置文件需全量满足当前工程运行时所需,因为它不会去与 resources 目录下的配置文件去做 merge 操作。 --spring.config.additional-location 配置后加载顺序,属性会merge. 同名属性以优先级高的为准 --spring.profiles.active springboot 默认是在src/main/resources文件夹中加载application.properties默认配置文件,格式为application-{profile}.properties,其中{profile}对应你的环境标识 在application.properties中添加spring.profiles.active = dev,database 也可通过命令行方式在启动jar包时使用spring.profiles.active = dev,database
再来加载不带profile
-
jar包外部的application.properties或application.yml(不带spring.profile)配置文件
-
jar包内部的application.properties或application.yml(不带spring.profile)配置文件
-
@Configuration注解类上的@PropertySource
-
通过SpringApplication.setDefaultProperties指定的默认属性
-
-
–spring.config.additional-location
- 配置后加载顺序,属性会merge. 同名属性以优先级高的为准
五、application文件的配置使用
-
spring.profiles.active属性
-
业务场景
一套程序可能会被部署到不同的环境。开发、测试、生产环境有不同的配置信息,包括jdbc地址、ip、端口等。如果在同一个配置文件中,每次部署去改配置,会非常麻烦且容易出错。
-
优化方式
spring.profiles.active属性 一个好方法就是创建不同的配置文件,且命名规则遵循application-${profile}.properties,例如: 开发环境配置文件:application-dev.properties 测试环境配置文件:application-test.properties 生产环境配置文件:application-prod.properties 当然,我们不能删除项目最顶层的application.properties(.yml)配置,在该文件中,根据部署场景不同,切换不同的配置文件:配置spring.profiles.active,属性值为${profile}。 spring.profiles.active=dev:启用application-dev.properties spring.profiles.active=test:启用application-test.properties spring.profiles.active=prod:启用application-prod.properties 可以同时激活多个配置文件,是通过逗号分割 spring.profiles.active=dev,sit,uat (同时启动多个配置文件,且相同属性值取值的优先级为:uat、sit、dev) 通俗说:dev和sit和uat三个配置里面,相同的属性的,谁写在后面谁优先级高。
-
启动时指定:
在执行有参启动时,可以在命令中进行指定要选用的配置文件,例如:
java -jar xx.jar --spring.profiles.active=test
这个命令的优先级是最高的,即使application.properties中已经配置spring.profiles.active=dev,最终程序还是会用application-test.properties配置文件。
-
-
spring.profiles.include属性
-
业务场景
对于开发环境,想用不同的配置文件存储开发环境不同的配置,例如:
application-dev1.properties中存储jdbc信息
application-dev2.properties中存储ip、端口信息
即在启用application-dev.properties开发环境(主)配置文件时,同时启用application-dev1.properties和application-dev2.propertie。
那么,可以使用spring.profiles.include属性:同时启用其他的profile -
配置方法:
若是properties文件:spring.profiles.include=dev1,dev2 若是yaml文件中, spring.profiles.include: -dev1 -dev2 或者:spring.profiles.include:dev1,dev2 --相同属性,2会覆盖1
-
配置的位置和区别:
配置方式一:application.properties中,配置spring.profiles.active=dev的同时指定spring.profiles.include=dev1,dev2 配置方式二:application.properties中,配置spring.profiles.active=dev,application-dev.properties中,配置spring.profiles.include=dev1,dev2。使用application-dev.properties时自动就激活了dev1、dev2两个文件,不用再次指定。(个人认为第二种方法更好) 区别: 第一种方式启动时,控制台打印The following profiles are active:dev1,dev2,dev --相同属性,2会覆盖1,dev会覆盖2 第二种方式启动时,控制台打印The following profiles are active:dev,dev1,dev2 --相同属性,1会覆盖dev,2会覆盖1
-
spring.profiles.include有spring.profiles.active一样的作用。可以激活对应的配置,其实spring.profiles.include的单纯作用就是将多个配置整合起来
比如我有多个配置文件每个负责一部分配置,配置文件如下:
application-prod_redis.yaml
application-prod_mq.yaml
application-prod_db.yaml
我现在只需要在application-prod.yaml文件中配置如下内容:spring.profiles.include: prod_redis,prod_mq,prod_db 这样只需要激活prod就同时拥有了redis和mq,db的配置了
-
-
spring.profiles属性
注:如果我们既要区分不同的环境,但是又要写在一个配置里面,就会需要这个属性。
这个属性就是用来指定配置文件文件的名称的
例: application.yaml = application-default.yaml --default application-dev.yaml --dev application-test.yaml --test application-prod.yaml --prod
如上图,我们在一个配置文件里配置了四个环境,中间是通过“—”分割成四个文档,YAML 文件可以由一或多个文档组成(也即相对独立的组织结构组成),文档间使用“—”(三个横线)在每文档开始作为分隔符。
同时,文档也可以使用“…”(三个点号)作为结束符(可选)
这四种环境就是靠spring.profiles配置的。
没有配置 相当于上图中 application.yaml 第一块
spring.profiles: dev 相当于 application-dev.yaml 第二块
spring.profiles: test 相当于 application-test.yaml 第三块
spring.profiles: prod 相当于 application-prod.yaml 第四块
而且 spring.profiles可以设定多个名称(其实就是别名),中间通过逗号分割,如:
spring.profiles: dev,dev1
那么在激活时,都相当于激活的是同一个配置,dev和dev1只是不同的别名罢了。
spring.profiles.active: dev
和
spring.profiles.active: dev1
六、@profile注解的使用
@profile注解一般是配合@Bean定义配置Bean,当对应的环境被激活时,会生成对应的配置bean。
-
简单使用
// 当spring.profiles.active=dev时激活这个bean // 或者当配置文件中包含dev环境时就可以激活该配置,就可以通过@Autowired方式注入属性值,并获取 // spring.profiles.include=sit,uat,dev // spring.profiles.active=sit,uat,dev @Profile({"dev","sit","uat"}) 只要其中一个满足就可以激活该bean 或 @Profile("dev") @Bean public User devUser() { return new User("dev", 20); } // 当spring.profiles.active=test时激活这个bean @Profile("test") @Bean public User testUser() { return new User("test", 21); }
七、配置文件的嵌套使用
-
application.yml(.properties)文件中(主配置文件)
spring.profiles.active=sit
-
application-sit.yml中
有:a=100
且:spring.profiles.active=uat
-
application-uat.yml中
有:a=200
且:spring.profiles.active=dev
-
application-dev.yml中
有:a=300
此时,代码中使用:${“a”},其结果值为:300