https://i.xue.taobao.com/my/learning.htm?spm=a2174.7365761.0.0.oxhqUo
第2章 Spring Boot 核心配置
2.1 Spring Boot的配置文件
Spring Boot 使用一个全局配置文件,放置在 src/main/resources 目录或类路径的 /config 下; application.properties application.yml
配置文件的作用:修改 Spring Boot 自动配置的默认值;
yml 是 YAML(YAML Ain't Markup Language)不是一个标记语言;
标记语言:以前的配置文件;大多都使用的是 xxxxx.xml文件;
YAML:以数据为中心,配置数据的时候具有面向对象的特征;比 json、xml 等更适合做配置文件;
2.2 YAML语法格式
2.2.1 YAML基本语法
key: value 表示一对键值对(冒号后面必须要有空格)
使用空格缩进表示层级关系
左侧缩进的空格数目不重要,只要同一层级的元素左侧对齐即可
key 与 value 大小写敏感
2.2.2 YAML常用写法
2.3 yaml 配置文件注入值
1)编写 JavaBean
2)编写 application.yml 配置文件
3)使用 SpringBoot 单元测试类进行测试
4)导入配置文件处理器,然后重新运行测试类,在编写配置文件时就会提示
2.4 properties 配置文件注入值
将 application.yml配置文件中的内容注释掉,编写application.properties 配置文件
运行后,发现 properties 文件在 idea 上中文乱码, 进行如下设置就会不会乱码
2.5比较 @Value 和 @ConfigurationProperties 获取值
使用 @Value 获取值,把 Emp 类中的 @ConfigurationProperties 注释掉
总结 @Value 与 @ConfigurationProperties 获取值的差异:
@ConfigurationProperties | @Value | |
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
2.6 JSR303数据校验_配置文件注入的值
@Validate注解
2.7 加载指定配置文件
2.7.1 @PropertySource 加载局部配置文件
@ConfigurationProperties 默认从全局配置文件(application.properties/application.yml)中获取值,
所有配置数据写在全局配置文件中,显得太臃肿了, 可将它们抽取出来,放到其他局部配置文件中。
2.7.2 @ImportResource 使用xml配置
SpringBoot提倡零配置, 即无xml配置,但是在实际开发中,可能有一些特殊要求必须使用 xml 配置;
这时我们可以通过 Spring 提供的 @ImportResource 来加载 xml 配置文件。
2.7.3 自定义配置类向容器注入组件
2.8 Profile 多环境支持
2.8.1 Profile介绍
Profile 是 Spring 用来针对不同的环境要求,提供不同的配置支持, 全局 Profile 配置使用的文件名可以是
application-{profile}.properties / application-{profile}.yml ; 如: application-dev.properties / application-prod.properties
演示案例:我们的项目环境分为 开发 (dev)和 生产(prod)环境 ,开发环境下端口号为 8082,
生产环境下端口号为8888 。
2.8.2 properties 文件演示案例
创建两个文件 application-dev.properties 与 application-prod.properties
激活指定profile
2.8.3 yml 文件演示案例
2.8.4 多种方式激活指定profile
2.9 配置文件加载位置
SpringBoot 启动时,会扫描以下位置的 application.properties 或者 application.yml 文件作为
Spring Boot的默认配置文件:
配置文件位置
说明
file:./config/
当前项目的config目录下(最高级别)
file:./
当前项目的根目录下
classpath:/config/
类路径的config目录下
classpath:/
类路径的根目录下(最低级别)
以上按照优先级从低到高的顺序,将所有位置的配置文件全部加载,高优先级的配置内容会覆盖低优先级的
配置内容。
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;
==我们还可以通过spring.config.location来改变默认的配置文件位置==
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;
注意:如果使用IDEA创建的项目是 Module (如果是 Project 则忽略),当前项目的根目录不是你这个项目所
有目录(是Project所在目录) ,这样使用 file: 存放配置文件时会找不到配置
解决方式:更改工作路径直接为Module所有目录 $MODULE_DIR$
配置文件到底能写什么?怎么写?
配置文件能配置的属性参照
https://docs.spring.io/spring-boot/docs/2.0.6.RELEASE/reference/htmlsingle/#common-application-properties
2.10 外部配置加载顺序
==SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置==
1.命令行参数
所有的配置都可以在命令行上进行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
多个配置用空格分开; --配置项=值
2.来自java:comp/env的JNDI属性
3.Java系统属性(System.getProperties())
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值
==由jar包外向jar包内进行寻找;==
==优先加载带profile==
6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
==再来加载不带profile==
8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10.@Configuration注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性
所有支持的配置加载来源;
注意:
SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式
1、配置类**@Configuration**------>Spring配置文件
2、使用**@Bean**给容器中添加组件
/**
* @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
*
* 在配置文件中用 标签添加组件
*
*/
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new HelloService();
}
}
3、配置文件占位符
1)随机数
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
2)占位符获取之前配置的值,如果没有可以是用:指定默认值
person.last-name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15