SpringBoot 配置文件
yaml(YAML Ain’t Markup Language)
语言文件, 已数据为中心, 比
json
,xml
等 更适合做配置文件
yaml语法
配置端口号为80;
server:
port: 80
# 项目访问路径
context-path:/
1. 基本语法
属性和值区分大小写
key: value
: 表示一对键值对(空格必须有);
以空格的缩进控制层级关系, 只要是左对齐的一列数据都是同一层级
server:
prot:80
path: /hello
2. 值的写法
字面量: 普通的值(数字, 字符串, 布尔)
-
k: v
-
字符串默认不加单引号或双引号
-
""
:双引号; 不会转义字符串中的特殊字符, 特殊字符会作为本身想表示的意思name: "zhangshan\nlisi" --- 张三 换行 李四
-
''
: 单引号; 会转义特殊字符, 特殊字符最终只是一个普通字符串数据name: 'zhangshan\nlisi' --- 张三\n李四
-
对象 / Map (属性和值)(键值对):
-
k: v
-
对象 / Map
# 普通写法 people: name: zhangsan age: 20 # 行内写法 user: {username: zhangsan, age: 20}
-
数组(List / Set):
-
用
-
值表示数组中的一个元素# 普通写法 pets: - cat - dog - pig # 行内写法 pets: [cat,dog,pig]
3. 配置文件的占位符
-
随机数
${random.value} ${random.int} ${random.long} ${random.int(10)} ${random.int[1024, 65536]}
-
占位符
获取之前配置的值, 如果没有可以使用
:
指定默认值person.dog.age=${person.ages:10}
配置文件值注入
yaml
配置文件编写
person:
name: harlan
age: 24
sex: true
birth: 1997/11/17
map: {k1: v1, k2: v2, k3: v3}
list:
- first
- secound
- three
- four
- five
dog:
name: doudou
age: 2
domain
编写:
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Boolean sex;
private Date birth;
private Map<String, Object> map;
private List<Object> list;
private Dog dog;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getSex() {
return sex;
}
public void setSex(Boolean sex) {
this.sex = sex;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
需要在domain
中添加@ConfugurationProperties
注解, 并指定前缀, 然后使用@Component
注解添加到Spring容器中
注意:同时我们可以在pom中导入配置文件处理器, 使得编写yaml
配置时有提示信息
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
使用application.proties
配置
person.name=harlan
person.age=23
person.birth=1997/11/17
person.list=a,b,c
person.map.k1=v1
p erson.map.k2=v2
person.sex=true
@Value
获取值和@ConfigurationProperties
获取值比较
如果说, 欧美只是在某个业务逻辑中需要获取一下配置文件中的某项值, 使用@Value
注解
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个一个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验(@Validated ) | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
@Validated
数据校验
需要导入数据校验场景依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
在需要校验的属性上添加校验注解
@Component
@Validated
@ConfigurationProperties(prefix = "person")
public class Person {
@Email
private String email;
...
}
@PropertySource
注解
用于加载指定的配置文件
@Component
@ConfigurationProperties(prefix = "person")
@PropertySource(value = {"classpath:person.properties"})
public class Person {
...
}
@ImportResource
注解
用于导入Spring的配置文件, 让配置文件中的内容生效
作用于主配置类
上, 导入需要的spring配置文件
@SpringBootApplication
@ImportResource(locations = {"classpath:beans.xml"})
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
@Configuration
配置类
在类中加上@Configuration
注解, 指定当前类是一个配置类, 其作用相当于Spring的配置文件
/**
* @Configuration:指明当前类是一个配置类, 就是来替代之前的Spring配置文件
* 在配置文件中使用<bean>标签添加组件
* @Author Harlan
* @Date 2020/10/3
*/
@Configuration
public class MyAppConfig {
/**
* 将方法的返回值添加到容器中
* @return helloService
*/
@Bean
public HelloService helloService(){
return new HelloService();
}
}
@Bean
注解
其作用在方法上, 用于将方法的返回值注入到IoC
容器中, 相当于Spring配置文件中的<bean>
标签
/**
* 将方法的返回值添加到容器中
* @return helloService
*/
@Bean
public HelloService helloService(){
return new HelloService();
}
Profile
1. 多Profile文件
我们在著配置文件编写的时候, 文件名可以是 application-{profile}.properties/.yml
默认使用application.properties/.yml
配置文件
2. yml文档块
使用---
来分割不同的配置信息
profiles
: 指定模式名称
active
: 指定激活
spring:
profiles:
active: prod
server:
port: 8080
---
spring:
profiles: dev
server:
port: 8081
---
spring:
profiles: prod
server:
port: 80
3. 激活指定profile
-
在配置文件中指定
spring.profiles.active=dev
spring: profiles: active: dev
-
命令行方式激活
--spring.profile.active=dev
-
将项目打成jar包, 使用cmd命令指定参数
-Dspring.profiles.active=dev
配置文件加载位置
spring boot启动会扫描以下位置的application
配置文件作为Spring Boot的默认配置文件.
file:./config/
> file:./
> classpath:./config/
> classpath:./
以上按照优先顺序从高到低加载, 所有位置的文件都会被加载, 高优先级配置内容会覆盖低优先级配置内容, 其他配置内容互补.
同时我们也可以通过配置spring.config.location
来改变默认配置
外部配置加载顺序
SpringBoot也可以从以下位置加载配置, 按照优先级从高到低; 高优先级的配置覆盖低优先级配置, 其余互补
-
命令行参数
java -jar spring-boot-xxx-xxx-xxx-SNAPSHOT.jar --server.prot=80 --server.context-path=/hello
-
来自
java:comp/env
的JNDI
属性 -
Java系统属性(System.getProperties)
-
操作系统环境变量
-
RandomValuePropertySource
配置random.*
属性值
优先加载带profile的配置文件, 由
jar
包外向jar
包内寻找 -
jar
包外部的application-{profile}.properties/yml
(带Spring.profile
)配置文件 -
jar
包内部的application-{profile}.properties/yml
(带Spring.profile
)配置文件 -
jar
包外部的application.properties/yml
(不带Spring.profile
)配置文件 -
jar
包内部的application.properties/yml
(不带Spring.profile
)配置文件 -
@Configuration
注解类上的@PropertySource
-
通过
SpringApplication.setDefaultProperties
指定的默认属性
所有支持的配置参考SpringBoot参考官方文档: https://spring.io/guides#getting-started-guides
自动配置原理
未学习明白!