6、配置文件占位符
RandomValuePropertySource 配置文件中可以使用随机数
${random.value} ${random.int} ${random.uuid} ${random.long} ${random.int(10)} ${random.int[1024,65536]}
属性配置占位符
app.name=MyApp app.description=${app.name:默认值}
7、Profile 多环境支持
Profile 对不同环境提供不同配置功能的支持
1、多 Profile 文件
application-{profile}.properties
默认使用
application.properties
通过 spring.profiles.active=prod 指定配置文件
eg:
application.properties
server.port=8080
spring.profiles.active=prod
application-dev.properties
server.port=8081
application-prod.properties
server.port=8082
2、yaml 文档块模式
application.yml
server: port: 8080 spring: profiles: active: dev --- server: port: 8081 spring: profiles: dev --- server: port: 8082 spring: profiles: prod
3、激活方式
1、命令行 --spring.profiles.active=dev 2、配置文件 spring.profiles.active=dev 3、jvm参数 -Dspring.profiles.active=dev
8、配置文件的加载位置
Spring Boot 会自动扫描一下位置的
application.properties 或者 application.yml 文件作为配置文件
优先级从高到低,所有文件都被加载,
互补配置:高优先级覆盖低优先级
./config/ ./ classpath:/config/ classpath:/
spring.config.location 修改默认位置
9、外部配置加载顺序
优先级从高到低如下
1. 命令行参数 $ java -jar springboot-helloword-1.0-SNAPSHOT.jar --server.port=8005 2. java:comp/env的JNDI属性 3. java系统属性System.getProperties() 4. 操作系统环境变量 5. RandomValuePropertySource配置的random.*属性 6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件 7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件 8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件 9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件 10. @Configuration注解类上的@PropertySource 11. 通过SpringApplication.setDefualtProperties指定的默认属性
总结:
- 高优先级配置会覆盖低优先级配置
- 所有配置会形成互补配置
10、自动配置原理
扫描配置文件内容包装成 properties 对象
将配置内容加载到容器中
- AutoConfiguration 自动配置类
- Properties 封装属性
- @Condition 判断条件成立,决定配置类是否生效
11、@Conditional&自动配置报告
@ConditionalOnJava @ConditionalOnMissingBean @ConditionalOnClass ...
自动配置类必须在一定的条件下才生效
开启调试模式
debug=true
打印自动配置报告
=========================
AUTO-CONFIGURATION REPORT
=========================
Positive matches: 启动的自动配置类
Negative matches: 没启用启动的自动配置类
Exclusions:
Unconditional classes: