目录
1.5、配置文件
1.5.1、默认配置文件
SpringBoot是为了简化Spring的开发而产生的,但是它并非没有配置文件,配置文件的作用就是修改一些默认的配置值,SpringBoot会自动将这些值进行配置。
而 SpringBoot 默认使用以下 2 种默认的配置文件,且文件名是固定的:application.properties 、apllication.yml。
-
properties 文件我们已经使用过了,它是以 键=值 的形式保存数据
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url= jdbc:mysql://localhost:3360/库名 jdbc.username=root jdbc.password=123456
-
yml文件 是YAML 格式的语言,使用缩进表示层级关系,同级元素必须左侧对齐,上下级元素换行缩进,相对于properties 而言它结构更清晰也更简单。
比如:我们使用YML文件配置数据库的连接,相对 properties 文件来说它具有阅读性更强的层级关系。
#配置数据库连接 jdbc: driver: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3360/库名 username: root password: 123456
Spring Boot 项目中可以存在多个 application.properties 或 apllication.yml。Spring Boot 启动时会扫描以下 5 个位置的 application.properties 或 apllication.yml 文件,并将它们作为 Spring boot 的默认配置文件。以下是按照优先级的顺序从高到低的加载顺序:
- file:./config/*/
- file:./config/
- file:./
- classpath:/config/
- classpath:/
1.5.2、YAML 语法
YAML文件是SpringBoot支持的配置文件的一种,且是SpringBoot 推荐使用的。
YAML 全称 YAML Ain’t Markup Language,它是一种以数据为中心的标记语言(以 .yml 或 .yaml 结尾),Spring Boot 中的 spring-boot-starter-web 或 spring-boot-starter 都对 SnakeYAML 库做了集成, 只要项目中引用了这两个 Starter 中的任何一个,Spring Boot 会自动添加 SnakeYAML 库到 classpath 下。
-
YAML 的语法如下:
-
使用缩进表示层级关系,同级元素必须左侧对齐,上下级元素换行缩进。
-
#表示注释
-
键和值用 :分开,且在 :后值前需要添加一个空格,这个空格是不能省略的 k:(空格)v
-
属性和值的大小写都敏感。
-
字符串默认不用加上单引号或者双引号;
加上 “”:双引号;不会转义字符串里面的特殊字符。“张三\n 李四”:输出;张三 (换行) 李四
加上 ‘’:单引号;会转义特殊字符,‘张三\n 李四’:输出;张三 \n 李四
-
-
YAML支持的数据结构:
-
对象:
# 对象 student1: name: 张三 age: 18 #对象的行内写法 student2: {name: 张三,age: 18}
-
数组、集合:内部元素以 - 开头
#数组 name1: - java - vue - springboot #数组行内写法 name2: [java,vue,springboot]
-
字面量:字符串、布尔值、整数、浮点数、null、时间、日期
boolean: - TRUE - FALSE float: - 3.14 - 6.8523015e+5 #可以使用科学计数法 int: - 123 - 0b1010_0111_0100_1010_1110 #二进制表示 null: nodeName: 'node' parent: ~ #使用~表示null string: - 哈哈 - 'Hello world' #可以使用双引号或者单引号包裹特殊字符 - newline newline2 #字符串可以拆成多行,每一行会被转化成一个空格 date: - 2035-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd datetime: - 2099-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
-
-
引用:& 锚点和 * 别名
defaults: &defaults adapter: postgres host: localhost development: database: myapp_development <<: *defaults #相当于 development: database: myapp_development adapter: postgres host: localhost
1.5.3、外部配置文件
Spring Boot 除了默认配置文件外还可以加载一些项目外的配置文件(也是yml、properties文件)。我们可以通过 2 个参数,指定外部配置文件的路径:
- spring.config.location =xxx.yml/properties:使项目原本的配置文件失效。
- spring.config.additional-location =xxx.yml/properties:不会使项目内置的配置文件失效,两者会互补,但是additional-location配置的文件优先级更高。
首先使用 Maven 命令 package进行打包处理,完成后会出现文件 springbootpoject-0.0.1-SNAPSHOT.jar
![image-20220919121737411](https://i-blog.csdnimg.cn/blog_migrate/0c4a48d10d47c7c48a81240ff01643d1.png)
打开cmd命令行,跳转到此文件所在的文件夹后,执行命令即可使用外部的配置:
java -jar springbootpoject-0.0.1-SNAPSHOT.jar --spring.config.location=application.properties的位置
java -jar springbootpoject-0.0.1-SNAPSHOT.jar --spring.config.additional-location =xxx.yml/properties的位置
1.5.4、配置数据绑定
所谓 配置绑定 就是把配置文件中的值与 Bean 中对应的属性进行绑定。
以yml文件为例,设置属性
person:
name: 张三
age: 22
list:
- java
- python
deleted: true
SpringBoot 提供了以下 2 种方式进行配置绑定:
-
使用 @ConfigurationProperties 注解
<!-- 配置注解处理器:@ConfigurationProperties:添加配置注解处理器后可用 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
@Component @ConfigurationProperties(prefix = "person") @Data public class Person { private String name; private int age ; private List<String> list; private boolean deleted; }
@Resource private Person person; @Test public void test(){ System.out.println(person.toString()); }
-
使用 @Value 注解
@Data @Component public class Person { @Value("${person.name}") private String name; @Value("${person.age}") private int age ; //不支持list private List<String> list; @Value("${person.deleted}") private boolean deleted; }
这两者都是配置绑定的,但是它们也有不同之处(如果只是获取单个值则使用@Value,如果有专门的JavaBean对应则使用@ConfigurationProperties):
@ConfigurationProperties | @Value | |
---|---|---|
使用位置 | 用在类上,指定配置文件中的对象名,批量注入相关属性 | 用在属性上,一个个的指定 |
松散绑定 | 支持 | 不支持 |
EL表达式 | 不支持 | 支持 |
数据类型 | 支持所有类型数据的封装 | 只支持基本数据类型的封装 |
JSR303数据验证 | 支持 | 不支持 |
1.5.5、JSR303数据验证
JSR303数据验证:是JavaEE6的提出的一项规范,叫做 Bean Validation,专门用于参数的效验。
<!--JSR303数据验证-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
- @Null:带注释的元素必须为null
- @NotNull:带注释的元素不能为null
- @NotBlank:只用于String类型上,检查字符串不能为null ,并且必须至少包含一个非空白字符。
- @NotEmpty:带注释的元素不得为null或为空。
- @AssertTrue :验证 Boolean 对象是否为 true
- @AssertFalse:验证 Boolean 对象是否为 false
- @Past:验证 Date 和 Calendar 对象是否在当前时间之前
- @Future:验证 Date 和 Calendar 对象是否在当前时间之后
- @Pattern:验证 String 对象是否符合正则表达式的规则
- @Size:带注释的元素大小必须在指定边界(包括)之间。
- @Length:检查String对象的大小是否在指定的范围内
- @Email:该字符串必须是格式正确的电子邮件地址。
- @Min:带注释的元素必须是一个数字,其值必须大于或等于指定的最大值。
- @Max:带注释的元素必须是一个数字,其值必须小于或等于指定的最大值。
- @Digits:带注释的元素必须是可接受范围内的数字。
- @Positive:注释元素必须是一个严格的正数(即 0 被视为无效值)。
- @PositiveOrZero:带注释的元素必须是正数或 0。
1.5.7、导入Spring配置
SpringBoot的配置名字格式都是固定的,即使我们添加Spring的配置文件 ,也不会被识别,SpringBoot为了加载Spring的配置文件给了两个方式:@ImportResource注解、全注解的方式(@Configuration+ @Bean)。
-
在启动类上使用 @ImportResource 注解加载 Spring 配置文件
创建一个Spring.xml文件,配置一个Bean测试。
<bean id="person" class="com.yu.springbootpoject.pojo.Person"> <property name="name" value="张三"/> <property name="age" value="22"/> <property name="list"> <list> <value>spring</value> <value>springboot</value> </list> </property> <property name="delete" value="true"/> </bean>
//将 springxml 加载到项目中 @ImportResource(locations = {"classpath:/spring.xml"}) @SpringBootApplication public class SpringbootApplication { public static void main(String[] args) { SpringApplication.run(HelloworldApplication.class, args); } }
-
通过Spring提供的代替XML文件的一些注解实现(SpringBoot是推荐使用这种方式的)
@Configuration public class SpringConfig { @Bean public Person person(){ List<String> strings = new ArrayList<>(); strings.add("java"); strings.add("python"); Person person = new Person(); person.setName("张三"); person.setAge(22); person.setList(strings); person.setDelete(true); return person; } }
1.5.6、配置优先级
- 通过命令行参数加载的配置优先级最高,
- 来自java:comp/env的JNDI属性:是一组在Java应用中访问命名和目录服务的 API
- Java系统属性(System.getProperties());
- 操作系统环境变量
- 外部配置文件(带spring.profile)
- 内部配置文件(带spring.profile)
- 外部配置文件(不带spring.profile)
- 内部配置文件(不带spring.profile)
- @Configuration注解类上的@PropertySource