Spring Boot 使用一个全局配置文件,配置名是固定的
- application.properties
- application.yml
配置文件的作用:修改Spring Boot自动配置的默认值;Spring Boot在在底层都给自动配置好了
YAML:(YAML Ain’t Markup Language)
YAML A Markup Language:是一个标记语言
YAML isn’t Markup Language:不是一个标记语言
标记语言
以前配置文件:大多数都是*.xml文件
YAML:以数据为中心,比json,xml等更适合做配置文件
YAML:配置举例:配置端口号
server:
port:8081
XMl:
<server>
<port>8081</port>
</server>
YAML语法
1.基本语法
key:(空格)value 表示一个键值对(空格必须有)
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是统一层级的
server:
port: 8081
属性和值也是大小写敏感的
2.值得写法
字面量:普通的值(数字,字符串,布尔)
k: value 字面量直接来写
字符串默认不加上单引号或双引号
“”:双引号不会转义字符串里的特殊字符;特殊字符会作为本身想表达的意思
例:name: “张三\n男” 输出:张三 换行 男
‘’:单引号会转义特殊字符,特殊字符最后知识一个普通的字符串数据
例:name: “张三\n男” 输出:张三\n男
对象(属性和值)(键值对):
k: v形式
person:
name: zhangsan
sex: nan
person:
name: 张三
age: 16
行内写法:
person: {name: 张三,age: 16}
数组(list,set)
用-表示数组中的一个元素
//list
lists:
- 咋啊
- 哈哈
//行内写法
lists: {咋啊,哈哈}
//Map
maps: {k1: aa,k2: 11}
测试
person类
/**
* 将配置文件中配置的每一个值,映射到到这个组件中
* @ConfigurationProperties:告诉spring boot将本类中的所有属性和配置文件中的相关的配置进行绑定
* prefix = "person"配置文件中下面的那个属性进行映射
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private Date birth;
private Dog dog;
private Map<String,Object> maps;
private List<Object> lists;
dog类
public class Dog {
private String dname;
private String dcolor;
application.yml配置文件
person:
name: 张三
age: 16
birth: 2010/12/12
dog:
dname: 旺财
dcolor: 黑色
maps: {k1: aa,k2: 11}
lists:
- 咋啊
- 哈哈
Spring boot单元测试类
@SpringBootTest
class SpringBootTest1QuickApplicationTests {
@Autowired
Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
结果
application.properties
#server.port=8081
#idea properties 默认配置utf-8 需要转码
person.name=张三
person.age=16
person.birth=2020/12/12
#list
person.lists=a,b,c
#map
person.maps.k1=v1
person.maps.k2=v2
#对象
person.dog.dname=哈士奇
person.dog.dcolor=黑色
测试过程和YAML
如果不是YAML用application.properties输出打印会出现中文乱码我们要修改编码格式
@Value
@Component
//@ConfigurationProperties(prefix = "person")
@Validated //数据验证
public class Person {
//@Email name必须是邮箱格式
@Value("${person.name}")//获取配置文件中的值 松散格式:可以用userName 可以用user-name代替
private String name;
@Value("#{6*2}")//SpEL
private int age;
private Date birth;
private Dog dog;
private Map<String,Object> maps;
private List<Object> lists;
@ConfigurationProperties | @valu | |
---|---|---|
功能 | 批量注入文件中的属性 | 一个个的指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型 | 支持 | 不支持 |
配置文件yml和properties都能获取到值
如果说,我们只在某个业务逻辑中需要获取一下配置文件的某项值可以用@value
如果说,我们专门编写一个JavaBean来和配置文件进行映射的时候可以用@ConfigurationProperties
@RestController//等同于@ResponseBody,@ResponseBody
public class HelloController {
@Value("${person.name}")//通过@value 在properties配置文件中拿值
private String name;
@RequestMapping("/hello")
public String hello(){
return "hello "+name;
}
}
@PropertySource和@ImportResource
@PropertySource是加载指定文件
@ImportResource:导入Spring的配置文件,让配置文件里边的内容生效
spring boot里面没有spring的配置文件。我们自己编写的配置文件,也不能自动识别
想让spring的配置文件生效,加载进来;@ImportResource标记在一个配置类上
//导入的Spring配置文件让其生效
@ImportResource(locations = {"classpath:spring.xml"})
*配置文件占位符
随机数
#${random.value}随机
person.name=张三${random.value}
#${random.int[10,20]} 10-20内的随机数
person.age=${random.int[10,20]}
person.birth=2020/12/12
#list
person.lists=a,b,c
#map
person.maps.k1=v1
person.maps.k2=v2
#对象
person.dog.dname=哈士奇_${person.name}
#找不到hello的值 就用hello代替
person.dog.dcolor=黑色_${person.hello:哈哈}
Profile
1,多Profile文件
我们在编写主配置文件的时候,文件名可以是:application.{profile}.properties
默认使用的是application.properties
2,yml支持多文档快方式
server:
port: 8081
#激活profile
spring:
profiles:
active: dev
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod
3,激活指定的profile
在配置文件中指定spring.profiles.active=dev
命令行:在cmd运行时:java -jar springboot.jar --spring.profiles.active=dev
精髓
- spring boot 启动时会加载大量的自动配置类
- 我们只需要看我们需要的功能有没有springboot默认写好的自动配置类
- 我们再看这些自动配置类配置了那些组件;(只要我们要用的组件有,我们就不需要配置了)
- 给容器中自动配置类添加组件的时候,或从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值
xxxxAutoConfigurartion:自动配置类
给容器中添加组件
xxxxProperties:封装配置文件中的相关属性
可以再application.properties配置debug=true 属性来让控制台打印自动配置类,我们可以方便看到那些配置类生效了
Positive matches:已经启动的配置类
Negative matches:没有启用的配置类
日志
统一日志slf4j+logback
每一个日志框架都有自己的配置文件。使用slf4j以后,配置文件还是做成日志实现框架自己本身的配置文件
统一日志管理,不一样的框架用不同的jar包替换
如何让系统中 所有的日志都统一到slf4j:
1,将系统中其他日志框架先排除出去
2,用中间包来替换原有的日志框架
3,导入其他slf4j其他的实现
总结
1,Spring Boot底层也是使用的slf4j+logback*的方式进行日志记录
2,Spring Boot也把其他的日志都替换成了slf4j
如果我们要引入其他框架,一定要把这个框架默认的日志依赖移除掉,springboot能自动适配所有的日志。而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候只需要把这个框架的的日志依赖的日志框架排除掉