学习前先新建好一个spring boot工程,记得勾选Spring Web
配置文件的作用是修改SpringBoot自动配置的默认值 ,spring boot通过这些配置帮我们完成自动配置,极大地提高了我们开发的效率,如果我们像改这些默认的配置,可以在全局配置文件中进行修改
SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的
第一种:application.properties
,语法结构 :key=value,,新建项目就默认存在的,例如我们要改端口号:server.port=8081
第二种:application.yml
,语法结构 :key:空格value ,这种需要我们自己手动创建,例如我们要改端口号:
server:
port:8081
yaml以数据为中心,比json,xml等更适合做配置文件;
static:保存所有静态资源,如js,css,images
templates:保存所有模板页面(spring boot默认jar包使用嵌入式的tomcat,不支持jsp),可使用模板引擎
yaml对空格的要求很严格,如果少了空格,则对数据的配置就会失效;使用空格还可以用来表示层级关系(不允许用Tab键来缩进);属性和值的大小写。详细看下方的语法展示
yaml支持三种数据结构:
- 对象
- 一组按次序排列的值
- 单个的,不可分割的值
字符串默认不用加上单双引号,如果加上双引号会转移特殊字符,如\n
到时候输出换行;单引号则不会转移特殊字符,\n
直接纯输出“\n”
之前学ssm的时候我们把对象的创建都交给了spring容器,但是我们给对象的属性设置值时,需要通过注解
@Value
,@Autowired
等操作,这样相对来说还是比较繁琐的,这里我们可以通过yaml来进一步简化
注: 使用properties的话,则需在每个属性前加上
student.
,如student.name
,student.age
,这样子相对yml的层级表示,会繁琐一些
@ConfigurationProperties
的作用是将配置文件中的值映射到该类中一一对应
如果加入@ConfigurationProperties
后上面出现报红提示,这需要导入配置文件处理器,我们可以加入以下依赖,作用是配置文件进行绑定就会有提示
org.springframework.boot
spring-boot-configuration-processor
true
@SpringBootTest
class SbConfigApplicationTests {
@Autowired
private Student student;
@Test
void contextLoads() {
System.out.println(student);
}
}
这里也有第二种方式获取配置文件中对象的属性值(不用@ConfigurationProperties
注解):例如在name
属性上加上注解Value("${student.name}")
等等,但是这种方法没有直接用@ConfigurationProperties
注解批量注入方便
JSR303校验用于对目标属性的注入类型进行校验,我们只需在目标类上加入注解
@Validated
,然后在目标方法上加入对应的校验注解即可,对应的校验注解的message属性可以用来自定义报异常的提示内容
@Null
验证对象是否为null
@NotNull
验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank
检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty
检查约束元素是否为NULL或者是EMPTY.
@AssertTrue
验证 Boolean 对象是否为 true
@AssertFalse
验证 Boolean 对象是否为 false
@Size(min=, max=)
验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=)
string is between min and max included.
@Past
验证 Date 和 Calendar 对象是否在当前时间之前
@Future
验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern
验证 String 对象是否符合正则表达式的规则
…
@Value
和@ConfigurationProperties
比较@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 单个注入 |
松散绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
当只是在业务逻辑中获取一下配置文件中的某项值,则使用
@Value
;如果是一个Bean专门获取配置文件的值来映射,则使用@ConfigurationProperties
@PropertySource
,@ImportResource
和@Bean
@PropertySource
:加载指定的配置文件
当我们把配置文件中的配置信息写在别的配置文件中需要指定读取这个配置文件时,如person.properties,就可以在目标类上加上注解@PropertySource(value={"classpath:person.properties"})
来读取目标配置文件了
@ImportResource
:导入Spring的配置文件,让配置文件中的内容生效
spring boot中没有spring的配置我呢见,我们自己编写的配置文件也不能自动识别,要想其识别和加载进来,使用@ImportResource
标注在一个配置类上
@Bean
:将方法的返回值添加到容器中,容器中的这个组件默认的id就是方法名
使用这个方法要现在类的上面加上注解Configuration
来指明当前类是一个配置类,用来代替之前的spring配置文件(在配置文件中使用标签来添加组件)
${random.value}
、${random.int}
、${random.long}
、${random.int(10)}
、${random.int[1024,65536]}
:xxx
”来指定默认值${app.name:默认值}
spring boot项目中会存在很多个配置文件,如开发用到,测试用的等等,这些配置文件中的具体内容都不同,那这些配置文件间的优先级和切换是怎么样的呢?
高优先级配置的内容会覆盖低优先级配置的内容,当项目打包成jar包后运行,当配置文件中的配置信息需要改动小部分时,运维人员可以通过在
java - jar 目标jar包名称
后加上spring.config,location=G:/xxx.properties
来改变默认配置
互补配置:如果我们在高优先级的配置文件指定端口号为8089,那项目运行时就是使用8089端口,我们可以在一个低优先级的配置文件种指定一个8088的端口,然后加入server.context-path=/boot02
,这样即使项目是用8089作为端口号,我们也可以在浏览器地址栏通过8088的端口下的/boot
路径来访问资源(前提是我们提前设置好了访问/boot
的控制器),这个就是互补配置
配置文件编写的时候,文件名可以是
application-{profile}.properties/yml
, 用来指定多个环境版本,如application-test.properties
代表测试环境配置;
在主配置文件中指定:
springboot默认启动主配置文件application.properties
,我们可以在主配置文件中加入spring.profiles.active=test
想要切换到我们自定义的其他配置文件(application-test配置文件)
命令行
虚拟机参数
在idea的右上角-配置选项-Edit configurations-Environment-VM options加入-Dspring.profiles.active=目标配置文件名
我们可以看到上面定义多个配置环境需要新建多个配置文件,这样相对来说也是会麻烦一些,我们可以在yaml中用“- - -”(三个横杠)来划分多个配置环境的信息(即在一个配置文件中实现多个配置文件信息的设置)
server:
port: 8081
#选择要激活那个环境块
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev #配置环境的名称dev
---
server:
port: 8084
spring:
profiles: prod #配置环境的名称prod
spring boot支持多种外部配置方式,官方文档(4.2. Externalized Configuration章节)对外部配置的介绍有17种,实际上用不到这么多,这里列出十一种
spring boot可以从上面这些位置加载配置文件:优先级从高到低,高优先级配置覆盖低优先级配置,所有配置会形成互补配置;由jar包向jar包内进行寻找,优先加载带profile,再加载不带profile的
SpringBoot启动会加载大量的自动配置类,我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中,我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了),给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可
xxxxAutoConfigurartion
:自动配置类;给容器中添加组件
xxxxProperties
:封装配置文件中相关属性
可以在配置文件中加入debug=true
,在控制台看输出的日志信息;Positive matches
:(自动配置类启用的:正匹配);Negative matches
:(没有启动,没有匹配成功的自动配置类:负匹配) ;Unconditional classes
: (没有条件的类)
该SpringBoot学习笔记学习自雷神和狂神说前辈,是对知识点的整理和自我认识的梳理,如有不当之处,欢迎指出