1、配置文件
springboot使用一个全局配置文件
application.properties
application.yml
作用:修改springboot的自动配置的默认值,springboot底层配置好的可以在此修改。
YAML(YAML Ain’t Makeup Language)
YAML A Makeup Language:是一个标记语言
YAML isn’t Makeup Language:不是一个标记语言
标记语言:
以前的配置文件,大多用xxx.xml,
yaml以数据为中心,没有大量标签开闭,比xml更适合做配置文件
server:
port: 8090
2、YAML语法
- 基本语法
k: v(键值对,空格必须有)
以空格的缩进来控制层级关系:只要左对齐数据,都是 同一层级的
属性和值大小写敏感
2.值的写法
字面量:普通的值(数字,字符串,布尔值)
k: v 字面直接写;
字符串不用加"" 或者 ’ ’
“”:双引号,不会转义字符串中的特殊字符;特殊字符会作为本身想表示的意思 name: “tt \n ss” 输出tt 换行 ss
’ ':单引号;会转义特殊字符,特殊字符最终只是一个普通字符串
name: “tt \n ss” 输出tt \n ss
对象、map(属性和值)(键值对):
k: v
对象还是k: v的方式;注意缩进
friends:
name: zs
age: 20
行内写法:
friends:{name: zs,age: 20}
数组(List、set)
用-值表示数组中的一个元素
pets:
- cat
- dog
- pig
行内写法:
pets:[cat,dog,pig]
3、配置文件注入
配置文件
person:
lastName: zhangsan
age: 18
boss: false
birth: 2019/01/01
maps: {k1: v1,k2: v2}
lists:
- lisi
- llliu
- yy
dog:
name: gg
age: 2
javaBean:
package com.magic.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @Description 将配置文件的每个属性值映射到组件
* @ConfigurationProperties:告诉springboot将本类中的所有属性和配置文件中相关的配置进行绑定
* prefix = ""配置文件中哪个下面的所有属性一一映射
*
* 只有这个组件是容器中的组件,才能使用容器中提供的@ConfigurationProperties功能
* @Author Chelsea
* @Date 2020/1/10 17:34
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
可以导入配置文件处理器,编写配置的时候有提示(lastName与last-name是一样的)
<!-- 导入配置文件处理器,绑定后会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
同理application.properties的配置文件
person.last-name=tet
person.age=25
person.birth=2019/01/01
person.boss=true
person.maps.k1=v1
person.maps..k2=v2
person.lists=a,b.c
person.dog.name=gg
person.dog.age=2
@Value(“true”)
@Value("${person.last-name}")
@Value("#{11*2}")
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
配置在yml还是properties都能获取到值;如果只是在某个业务中获取一下需要的值,使用@Value;如专门写个Javabean来映射配置文件中的值,用@ConfigurationProperties;默认从全局配置文件取值。
配置文件注入值数据校验
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
@Email
private String lastName;
@PropertySource/@ImportResource
@PropertySource 指定注入的配置文件
@PropertySource(value = "classpath:person.properties")
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {
@ImportResource:导入spring的配置文件,让配置文件的内容生效;
springboot里面没有spring的配置文件,我自己编写的也不能自动识别;
想让spring配置文件生效,加载进来,@ImportResource标注在一个配置类上
@ImportResource(locations = {"classpath:beans.xml"})
springboot推给容器中添加组件的方式:推荐使用全注解的方式
1.配置类===spring配置文件
2.使用@Bean给容器中添加组件
@Configuration//指明当前类是一个配置类,就是来替代spring配置文件,以前<bean></bean>标签加组件
public class MyConfig {
@Bean//将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名
public HelloService helloService(){
System.out.println("bean");
return new HelloService();
}
}
4、配置文件占位符
随机数
random.value,{random.int},${random.long} , ${random.uuid},
randon.int(10),{random.int[1024,65536]}
占位符获取之前配置的值,如果没有可以用:指定默认值
person.dog.name=${person.last-name}_dog
person.dog.name=${person.hello:hi}_dog
5、profile
多环境支持
1.多profile文件
主配置文件编写时,文件名可以是application-{profile}.properties/yml,
默认用文件名application.properties的配置;
2.yml支持多文档块
---
server:
port: 8081
spring:
profiles:
a
---
server:
port: 8052
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: prod
3.激活指定profile
在application.properties文件中可以配置激活环境
- spring.profiles.active=dev
- 命令行方式激活: java -jar xxx.jar --spring.profiles.active=dev,或者如下图配置
- 虚拟机参数设置
ps.在测试过程中发现properties比yml优先级高
6、配置文件的加载位置
file:./config/
file:./
calsspath:/config
classpath:/
以上安装优先级由低到高的顺序,所有位置的文件都会被加载,高优先级配置内容覆盖低优先级配置内容,可以互补配置
可以通过spring.config.location来改变默认配置文件位置
在运维时,可以使用命令行参数的形式,启动项目的时候指定配置文件的新位置,指定文件和默认加载的配置文件一起起作用,形成互补文件。 用Terminal这个便捷控制台,运行命令。
java -jar xxx.jar --spring.config.location=指定文件
7、外部配置的加载顺序
很多,目前关注下面的:(优先级从高到低)
- 命令行参数;
- jar包外的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包内的application-{profile}.properties或application.yml(带spring.profile)配置文件
优先加载带profile的再来加载不带profile的 - jar包外的application.properties或application.yml(带spring.profile)配置文件
- jar包内的application.properties或application.yml(带spring.profile)配置文件
8、自动配置原理
可以配置参数参考文档.
目前大概理解,后续深入。
自动配置原理.
学习整理于springboot