一 Spring Boot项目结构
- resources文件夹中目录结构
-
- static:保存所有的静态资源; js css images,
包括html文件也放再static(约定大于配置);
只要保存在该目录下的静态资源可以直接访问
-
- templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、thymeleaf,不支持html文件)
- application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;
二 配置文件的使用
2.1 配置文件介绍
SpringBoot使用一个全局的配置文件(核心配置文件)
配置文件名在约定的情况下名字是固定的;
配置文件名称只能叫application.properties 或者 application.yml
配置文件的作用:修改SpringBoot自动配置的默认值;
SpringBoot在底层都给我们自动配置好了
2.2 两种配置文件的格式
在springboot框架中,resource文件夹里可以存放配置的文件有两种:properties和yml。
可共存和混用
1、application.properties的用法:扁平的k/v格式。
server.port=8081
server.servlet.context-path=cctv
2、application.yml的用法:树型结构
注意:server代表一个对象
server:
port: 8082
servlet:
context-path: cctv
建议使用后者,因为它的可读性更强
如何互转:在线yaml转properties-在线properties转yaml-ToYaml.com
2.3 yml语法
k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
属性和值也是大小写敏感;
如果有特殊字符% & 记得用单引号‘ 包起来(了解)
2.4 配置文件的加载顺序
如果同时存在不同后缀的配置文件按照这个顺序加载主配置文件;互补配置;
实测后发现Spring Boot版本不一样优先级都不一样,比较混乱,这里统一说明下:
官方没有具体说明,以实测为准
实测 Spring Boot 2.7.3 版本以application.properties为准
总结: 官网建议整个应用程序使用一种格式,并且既然每个版本的优先级都有区别,我们就不要纠结这个后缀文件的优先级了。
2.5 外部约定配置文件加载顺序
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件,
以下扫描优先级由 低 到 高 第一(低优先级) :
扫描classpath根目录下的 application.properties或者application.yml
第二,扫描 classpath根目录下的config/
第三 直接指定配置文件 --spring.config.location
注意:使用外部配置文件后,不会再使用内部的配置
注意 如果只指定文件夹,没有指定具体的文件,则必须以 / 结尾
java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar --spring.config.location=D:\config/
也可以指定具体的配置文件
java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar --spring.config.location=D:\config\application.properties
结论:优先级由底到高,高优先级的配置会覆盖低优先级的配置;互补配置;
2.6 Profile文件的加载
SpringBoot框架提供了多profile的管理功能,我们可以使用profile功能来区分不同环境的配置。
1、多Profile文件
- Spring官方给出的语法规则是application-{profile}.properties(/.yaml/.yml)。
如: application-dev.properties
application-test.properties
application-prod.properties
application-dev.properties
server.port=8081
server.servlet.context-path=/cctv1
application-test.properties
server.port=8082
server.servlet.context-path=/cctv2
application-prod.properties
server.port=8083
server.servlet.context-path=/cctv3
- 激活指定profile
1 若我们需要在三种环境下进行切换,只需要在application.properties中加入如下内容即可:根据不同的环境指定不同的配置
spring.profiles.active=dev----配置使用dev里面的配置项
2 在启动命令行指定,如下:
java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
2.7 所有配置文件按以下顺序加载: 优先级从低到高
java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar
配置文件搜索顺序如下:
1 打包在jar中的配置文件(classpath) ,如:
2 打包在jar中的配置文件( classpath : config/ 下),如:
3 打包在jar中的profile
4 打包在jar中的profile ( classpath : config/ 下)
5 打包的jar之外的配置文件
6 打包的jar之外的配置文件(还带config文件夹的)
7 打包的jar之外的profile
三 配置文件值注入
将YAML映射到属性
1. 字面量:普通的值(数字,字符串,布尔)
k: v:字面直接来写,字符串默认不用加上单引号或者双引号;
如:
name: zhangsan
age: 12
isDelete: true
2. 对象、Map(属性和值)(键值对):
k: v:在下一行来写对象的属性和值的关系;注意缩进
对象:
person:
lastName: zhangsan
age: 18
boss: false
birth: 2017/1/1
3. 数组(List、Set) 用 - 值表示数组中的一个元素
person:
lastName: zhangsan
age: 18
boss: false
birth: 2017/1/1
pets:
- cat
- dog
- pig
行内写法:
person:
lastName: zhangsan
age: 18
boss: false
birth: 2017/1/1
pets: [cat,dog,pig]
- 其他示例:
person:
lastName: zhangsan
age: 18
boss: false
birth: 2017/1/1
pets:
- cat
- dog
- pig
pets2: [cat1,dog1,pig1]
maps: {k1: v1,k2: 12}
maps2:
k3: v3
k4: v4
dog:
name: 小狗
age: 12
dogs1:
- {name: 小狗1,age: 1}
- {name: 小狗2,age: 2}
dogs2: [{name: 小狗,age: 13},{name: 小狗1,age: 14}]
如何把YAML映射到 javaBean:
package com.cctv.beans;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 将配置文件中配置的每一个属性的值,映射到这个javabean组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件(application.properties)
* 中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个javabean组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能;
*
*/
//将JavaBean注入到容器里面
@Component
//将配置文件和JavaBean进行绑定。指定person这个前缀,JavaBean和配置文件的属性的值进行映射
@ConfigurationProperties(prefix = "person")
@Data
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private List<String> pets;
private Map<String,String> maps;
private Map<String,String> maps2;
private Dog dog;
private List<Dog> dogs1;
private List<Dog> dogs2;
private String wife;
private String address;
}
package com.cctv.beans;
public class Dog {
private String name;
private Integer age;
}
4. 如何 导入 Lombok
1 导入Jar包
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
2.安装lombok插件
如何做到根据配置类,在编写 yml 配置的时候有提示
如果出现如下提示:
- 1、添加依赖
<optional>true</optional>要设置一下 否则可能出现导入不了的情况
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 、启动processor(勾选如图)
- 3、重新编译模块(一定要重新编译一下 否则不能生效,生成下面一个META-INF)
Idea 社区版开启yaml文件自动提示功能
下载 Spring Boot Assistant 插件即可
- 4 自定义配置的元数据信息生成了,我们可以先编写配置类,在 yml 配置即刻会有提示
- 5 如果再重新定义JavaBean属性 必须重新编译
- 6 经过一系列操作后 原有的配置也都有了提示
- 松散绑定:
person:
lastName: zhangsan 小驼峰
last_name: zhangsan 蛇形
last-name: zhangsan 烤肉串
LASTNAME: zhangsan
ctrl+shift+u(大小写切换)
以上4种命名是可以自动绑定bean属性 person.lastName
- @Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | ||
绑定 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
自动提示 | 支持 | 不支持 |
使用场景
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
四 配置文件占位符
1、随机数
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
2、占位符获取之前配置的值,如果没有可以是用:指定默认值(重要)
${person.hello:hello} 这种表达方式非常重要
person.last‐name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15