1. 配置文件
1.1. 配置文件
SpringBoot默认有一个配置文件位于:src/main/resources/application.properties
其实有两个配置文件:
- application.properties
- application.yml
这两种配置文件是等效的,只是后缀不一样,所使用的语法也不同。
配置文件的作用:修改SpringBoot自动配置的默认值;
因为很多配置SpringBoot在底层都给我们自动配置好的,我们要修改为自己需要的值,那么就可以在配置文件里面覆盖;
1.1.1. YAML
YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。
1.1.1.1. 基本语法
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
1.1.1.2. 数据类型
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值
1.1.1.3. YAML对象
对象键值对使用冒号结构表示 key:(空格)value,冒号后面要加一个空格。
也可以使用 key:{key1: value1, key2: value2, ...}。
1.1.1.4. YAML数组
以 -
开头的行表示构成一个数组:
- A
- B
- C
YAML 支持多维数组,可以使用行内表示:
key: [value1, value2, ...]
数据结构的子成员是一个数组,则可以在该项下面缩进一个空格。
-
- A
- B
- C
意思是 companies 属性是一个数组,每一个数组元素又是由 id、name、price 三个属性构成。
1.1.1.5. 复合结构
数组和对象可以构成复合结构,例:
languages:
- Ruby
- Perl
- Python
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org
1.2. 两种配置文件比较
properties
server.port=9000
server.error.path=/error
yaml
server:
port: 9000
error:
path: /error
1.3. YAML配置的值的获取
yml文件内容:
person:
name: hello
age: 18
date: 2020/2/10
aBoolean: false
map: {"k1":"v1","k2":"v1"}
list:
- 1
- 2
- 3
- 4
dog:
name: dogg
age: 8
将配置文件值映射到bean类中:
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private Integer age;
private String name;
private Boolean aBoolean;
private Date date;
private Dog dog;
private Map<String, Object> map;
private List<Integer> list;
// getter and setter..必须要写,此处省略
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
解释:
必须要加注解:
- @Component
- @ConfigurationProperties(prefix = "person")
prefix代表前缀是什么,也即.yml文件中的第一个值。
加入依赖:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-configuration-processor -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
加入此依赖,IDEA就有自动提示了,需重新运行以下此项目。
测试:
package com.misiai;
import com.misiai.bean.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class BootApplicationTests {
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person.getAge());
}
}
解决中文乱码:
1.4. Spring注解方式获取值
@Value注解
package com.misiai.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Component
// @ConfigurationProperties(prefix = "person")
public class Person {
private Integer age;
@Value("${person.name}")
private String name;
private Boolean aBoolean;
private Date date;
private Dog dog;
private Map<String, Object> map;
private List<Integer> list;
}
@Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
总结:
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
1.5. 指定配置文件
@PropertySource("classpath:person.properties")
@Component
// @ConfigurationProperties(prefix = "person")
@PropertySource("classpath:person.properties")
public class Person {
private Integer age;
@Value("${person.name}")
private String name;
private Boolean aBoolean;
private Date date;
private Dog dog;
private Map<String, Object> map;
private List<Integer> list;
}
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上
@ImportResource(locations = {"classpath:beans.xml"})
导入Spring的配置文件让其生效
代码:
@SpringBootApplication
@ImportResource("classpath:beans.xml")
public class BootApplication {
public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args);
}
}
beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.misiai.service.HelloService" id="helloService"/>
</beans>
测试:
@Autowired
ApplicationContext ap;
@Test
void test1() {
boolean helloService = ap.containsBean("helloService");
System.out.println("helloService = " + helloService);
}
结果:
1.6. 自定义的配置文件
给容器中添加组件的方式:一个配置类
package com.misiai.config;
import com.misiai.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Configuration 代表是一个配置类
*/
@Configuration
public class MyConfig {
/**
* @Bean将方法的返回值添加到容器中,默认是组件的方法名
*/
@Bean
public HelloService helloService() {
return new HelloService();
}
}
1.7. 配置文件占位符
person:
age: 13
name: Wudao
dog:
name: ${person.name:冒号后面代表默认值} - Dog
官网自带的:
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
2. Profile
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml
默认使用application.properties的配置;
#server.port=9000
#server.error.path=/error
#person.dog.name=无道
#person.dog.age=12
server.port=1200
激活:
1、激活:在application.properties
spring.profiles.active=dev
server.port=9000
#server.error.path=/error
#person.dog.name=无道
#person.dog.age=12
spring.profiles.active=dev
2、命令行
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
3、虚拟机参数
-Dspring.profiles.active=dev
yml支持多文档块方式
server:
port: 8081
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod #指定属于哪个环境
3. 配置文件杂类
配置文件存放于类路径config文件夹
- file: ./config
- file:/
- classpath:config
- classpath:/
优先级高->低,会覆盖;形成互补配置。
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;
外部配置加载顺序
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.*属性值
6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10.@Configuration注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性