
本篇博客给大家带来的是SpringBoot配置文件的知识点, 有properties 配置文件 和 yml 配置文件, 目前主流的是yml,所以本文以 重点讲解 yml 配置文件.
🐎文章专栏: JavaEE进阶
👉gitte链接: 薯条不要番茄酱
🚀若有问题 评论区见
❤ 欢迎大家点赞 评论 收藏 分享
如果你不知道分享给谁,那就分享给薯条.
你们的支持是我不断创作的动力 .
王子,公主请阅🚀
- 要开心
- [1. 配置文件作用](#1. 配置文件作用)
- [2. 配置文件的常规操作](#2. 配置文件的常规操作)
- [3. 配置文件的格式](#3. 配置文件的格式)
- [4. properties 配置文件说明](#4. properties 配置文件说明)
-
- [4.1 properties 基本语法](#4.1 properties 基本语法)
- [4.2 读取配置文件](#4.2 读取配置文件)
- [4.3 properties 缺点分析](#4.3 properties 缺点分析)
- [5. yml 配置文件说明](#5. yml 配置文件说明)
-
- [5.1 yml 基本语法](#5.1 yml 基本语法)
- [5.2 yml 的用法](#5.2 yml 的用法)
-
- [5.2.1 yml 配置不同数据类型及 null](#5.2.1 yml 配置不同数据类型及 null)
-
- [5.2.1.1 yml 配置读取](#5.2.1.1 yml 配置读取)
- [5.2.1.2 注意事项:value 值加单双引号](#5.2.1.2 注意事项:value 值加单双引号)
- [5.2.2 配置对象](#5.2.2 配置对象)
- [5.2.3 配置集合](#5.2.3 配置集合)
- [5.2.4 配置Map](#5.2.4 配置Map)
- [5.3 yml 优缺点](#5.3 yml 优缺点)
- [6. 综合性练习](#6. 综合性练习)
-
- [6.1 验证码案例](#6.1 验证码案例)
-
- [6.1.1 Hutool 工具包介绍](#6.1.1 Hutool 工具包介绍)
- [6.1.2 需求](#6.1.2 需求)
- [6.1.3 准备工作](#6.1.3 准备工作)
- [6.1.4 约定前后端交互接口](#6.1.4 约定前后端交互接口)
- [6.1.5 实现服务器端代码](#6.1.5 实现服务器端代码)
- [6.1.6 调整前端页面代码](#6.1.6 调整前端页面代码)
- [6.1.7 运行测试](#6.1.7 运行测试)
-
-
要开心
要快乐
顺便进步
1. 配置文件作用
计算机上有数以千计的配置文件, 我们使用的绝大多数软件, 比如浏览器, 微信, Idea, 甚至电脑, 手机, 都离不开配置文件. 我们可能永远不会直接与其中的大部分文件打交道,但它们确实以不同的形式散落在我们的计算机上, 比如 C:\Users, C:\Windows文件夹, 以及各种 *.config, *.xml 文件
配置文件主要是为了解决硬编码带来的问题, 把可能会发生改变的信息, 放在一个集中的地方, 当我们启动某个程序时, 应用程序从配置文件中读取数据, 并加载运行.
硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中, 也就是我们常说的"代码写死".
使用配置文件, 可以使程序完成用户和应用程序的交互, 或者应用程序与其他应用程序的交互。
SpringBoot配置文件
SpringBoot 支持并定义了配置文件的格式, 也在另一个层面达到了规范其他框架集成到SpringBoot的目的.
很多项目或者框架的配置信息也放在配置文件中, 比如:
• 项目的启动端口: SpringBoot内置了Tomcat服务器, 默认端口号是8080。
• 数据库的连接信息(包含用户名和密码的设置): 对JDBC进行了更深层次的封装.让用户通过简单几行代码就可完成数据库的访问。
• 第三方系统的调用密钥等信息。
• 用于发现和定位问题的普通日志和异常日志等。
2. 配置文件的常规操作

修改 application.properties 文件
java
server.port=9090
启动程序,观察日志:

显示Tomcat启动端口号为9090 。
3. 配置文件的格式
Spring Boot 配置文件有以下三种:
Ⅰapplication.properties
Ⅱ application.yml
Ⅲ application.yaml
yml 为 yaml 的简写, 实际开发中出现频率最高. yaml 和yml 的使用方式一样, 文章中只介绍 yml 文件的使用。
当应用程序启动时, Spring Boot会自动从 classpath 路径找到并加载
application.properties 和 application.yaml 或者 application.yml 文件。

如上图所示 .properties 和 .yml 可以并存在于一个项目中 ,
当 .properties 和 .yml 并存时,两个配置都会加载. 如果配置文件内容有冲突, 则以 .properties 为主, 也就是
.properties 优先级更高. 需要注意的是虽然 .properties 可以和 .yml 共存, 但是实际开发当中, 我们通常会采取一种统一的配置文件格式, 这样方便后续的维护,降低出故障的概率。
4. properties 配置文件说明
properties 配置文件是最早期的配置文件格式,也是创建 SpringBoot 项目 默认的配置文件。
4.1 properties 基本语法
properties 是以键值的形式配置的,key 和 value 之间是以"="连接的,如:
java
#配置项目端口号
server.port=9090
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=handsome
spring.datasource.password=boy
想了解Spring Boot配置文件更多内容和细节: Spring Boot配置文件官网
4.2 读取配置文件
如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。
@Value 注解使用 " ${} " 的格式读取, 如下代码所示:
properties 配置如下:
java
server.port=9090
mykey=aa
创建一个新的类 ReadymlController
java
@RequestMapping("/yml")
@RestController
public class ReadymlController {
@Value("${mykey}")
private String key;
@RequestMapping("/readyml")
public String readYml() {
return "从yml中获取配置文件: "+key;
}
}
运行程序, 并在浏览器访问 http://127.0.0.1:9090/yml/readyml
有如下结果说明获取成功.

4.3 properties 缺点分析
properties 配置文件中会有很多的冗余的信息,比如:

想要解决这个问题,就可以使用 yml 配置文件的格式化了.
5. yml 配置文件说明
yml 全称 Yet Another Markup Language 翻译成中文就是 "另一种标记语言".
5.1 yml 基本语法
yml 是树形结构的配置⽂件,它的基础语法是"key: value"
key 和 value 之间使用英文冒号加空格的方式组成,空格不可省略.

使用 yml 连接数据库
java
spring:
datasource:
url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
username: root
password: root
可以发现不用像 properties那样重复去写 spring 和 datasource.
5.2 yml 的用法
5.2.1 yml 配置不同数据类型及 null
java
# 字符串
string.value: hello
# 布尔值, true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 520
# 浮点数
float.value: 13.14
# Null, ~代表 null
null.value: ~
# 空字符串
empty.value: ''
# 直接后面什么都不加也可以,但是这种方式不直观.更多的表⽰是使⽤引号
empty.value1:
5.2.1.1 yml 配置读取
yml 读取配置的方式和 properties 相同,使用 @Value 注解即可,实现代码如下:
yml 配置:
java
server:
port: 9090
str:
value: hello
ReadymlController 文件代码:
java
@Value("${mykey}")
private String key;
@Value("${str.value}")
private String string;
@RequestMapping("/readymlstr")
public String readYmlstr() {
return "从yml中获取配置文件: "+string;
}
@RequestMapping("/readyml")
public String readYml() {
return "从yml中获取配置文件: "+key;
}
访问 http://127.0.0.1:9090/yml/readymlstr
运行结果:

5.2.1.2 注意事项:value 值加单双引号
字符串默认不用加上单引号或者双引号,如果加英文的单双引号可以表示特殊的含义。
在 application.yml 中配置如下信息:
java
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
ReadymlController 文件代码:
java
@Value("${string.str1}")
private String str1;
@Value("${string.str2}")
private String str2;
@Value("${string.str3}")
private String str3;
@RequestMapping("/readyml4")
public String readYml4() {
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
return "从yml中获取配置文件";
}
以上程序的执行结果如下图所示:

从上述结果可以看出:
字符串默认不用加上单引号或者双引号.
单引号会转义特殊字符,使其失去特殊功能, 始终是一个普通的字符串.
双引号不会转义字符串里面的特殊字符, 特殊字符会表示本身的含义.
\n 本意表示的是换行, 使用单引号会转义,就是说, \n 不再表示换行了, 而是表示一个普通的字符串. 用双引号不会转义, 表示 \n 表示的是它本身的含义, 就是换行.
5.2.2 配置对象
yml 中配置对象
java
student:
id: 1
name: Java
age: 18
这个时候就不能用 @Value 来读取配置中的对象了,此时要使用另一个注解
@ConfigurationProperties 来读取,在 Student 文件中 :
java
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 配置对象
*/
@ConfigurationProperties(prefix = "student")//从配置文件中获取默认值.
@Component//交给spring管理
@Data
public class Student {
// id: 1
// name: Java
// age: 18
private Integer id;
private String name;
private Integer age;
}
调用类的实现如下:
java
@RequestMapping("/yml")
@RestController
public class ReadymlController {
@Autowired
private Student student;
@RequestMapping("/readStudent")
public String readStudent() {
return "从yml中获取配置文件Student: "+student;
}
}
运行结果如下所示:

5.2.3 配置集合
配置文件也可以配置 list 集合,如下所示:
java
dbtypes:
name:
- mysql
- sqlserver
- db2
集合的读取和对象一样,也是使用 @ConfigurationProperties 来读取的.
java
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 配置集合
*/
@ConfigurationProperties("dbtypes")
@Component
@Data
public class DbType {
private List<String> name;
}
访问集合的实现如下:
java
@RequestMapping("/yml")
@RestController
public class ReadymlController {
@Autowired
private DbType dbType;
@RequestMapping("/readDbtype")
public String readDbtype() {
return "从yml中获取配置文件readDbtype: "+dbType;
}
}
5.2.4 配置Map
配置文件也可以配置 map
java
maptypes:
map:
k1: 1
k2: 2
k3: 3
Map的读取和对象一样,也是使用 @ConfigurationProperties 来读取的
java
import java.util.Map;
@ConfigurationProperties("maptypes")
@Component
@Data
public class MapType {
private Map<String,String> map;
}
打印类实现如下:
java
@RequestMapping("/yml")
@RestController
public class ReadymlController {
@Autowired
private MapType mapType;
@RequestMapping("/readMaptype")
public String readMaptype() {
return "从yml中获取配置文件readMaptype: "+mapType;
}
}
5.3 yml 优缺点
优点:
- 可读性高,写法简单, 易于理解。
- 支持更多的数据类型, 可以简单表达对象, 数组, List,Map等数据形态.
- 支持更多的编程语言, 不止是Java中可以使用, 在Golang, Python, Ruby, JavaScript中也可以使用。
缺点:
- 不适合写复杂的配置文件
- 对格式有较强的要求(一个空格可能会引起一场血案)
6. 综合性练习
6.1 验证码案例
随着安全性的要求越来越高, 目前项目中很多都使用了验证码, 验证码的形式也是多种多样, 更复杂的图形验证码和行为验证码已经成为了更流行的趋势.
验证码的实现方式很多, 网上也有比较多的插件或者工具包可以使用, 本文选择使用 Hutool工具包 来实现.
6.1.1 Hutool 工具包介绍
详细见链接: Hutool
- 原理
验证码可以客户端生成, 也可以服务器生成. 对于普通的字符验证码, 后端通常分两部分.
一是生成验证码内容, 根据验证码内容干扰项等, 生成图片, 返回给客户端
二是把验证码内容存储起来, 校验时取出来进行对比. Hutool 把验证码存储在Session里.
- 使用前需引入Hutool 依赖.
java
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-captcha</artifactId>
<version>5.8.16</version>
</dependency>
6.1.2 需求
界面如下图所示:
- 页面生成验证码
- 输入验证码, 点击提交, 验证用户输入验证码是否正确, 正确则进行页面跳转.

6.1.3 准备工作
创建项目(captcha), 引入SpringMVC的依赖包, 把前端页面放在项目中。
gitte链接: 薯条不要番茄酱

6.1.4 约定前后端交互接口
需求分析
后端需要提供两个服务
- 生成验证码, 并返回验证码
- 校验验证码是否正确.
接口定义:
- 生成验证码
请求: captcha / get
参数: session 存储图片上的答案,方便比较.
返回值: 无.
- 校验验证码是否正确.
请求: captcha / check
参数: inputCode, session
返回值: true 或 false.
6.1.5 实现服务器端代码
- 引入依赖
java
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-captcha</artifactId>
<version>5.8.16</version>
</dependency>
- 通过配置 yml 文件
java
captcha:
width: 200
height: 100
session:
key: captcha_session_key
date: captcha_session_date
- CaptchaController 文件代码如下:
java
@RequestMapping("/captcha")
@RestController
public class CaptchaController {
private final static long session_valid_timeout = 60 * 1000;
@Autowired
private CaptchaProperties captchaProperties;
@RequestMapping("/get")
public void getCaptcha(HttpSession session, HttpServletResponse response) {//响应中的所有数据都可以去 response中拿.
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight());
//抓包发现该请求没有ContentType,但是 Spring 默认会返回 ContentType.
response.setContentType("image/jpeg");
//禁止缓存
response.setHeader("Progma","No-cache");
//图形验证码写出,可以写出到文件,也可以写出到流
try {
lineCaptcha.write(response.getOutputStream());
String code = lineCaptcha.getCode();//拿到验证码答案.
//存储sesion
session.setAttribute(captchaProperties.getSession().getKey(),code);
session.setAttribute(captchaProperties.getSession().getDate(),new Date());//记录设置session时的时间
response.getOutputStream().close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/*
不同用户访问 /captcha/check , 拿到的session是不同的, 之前我们说过 sessionId 是唯一的.
那么session是怎么拿到的呢? 先从 HttpServletRequest中拿了 cookie, 在从cookie中 拿 sessionId
再根据 sessionId 拿到 session, 不同用户的 sessionId 不同, session自然不同。
简单理解 就是程序本身支持多线程.
*/
@RequestMapping("/check")
public Boolean check(String inputCode, HttpSession session) {
//验证码生成的内容, 和用户输入的进行比较
//session 获取信息
//校验
if(!StringUtils.hasLength(inputCode)) {
return false;
}
String saveCode = (String)session.getAttribute(captchaProperties.getSession().getKey());
Date saveDate = (Date) session.getAttribute(captchaProperties.getSession().getDate());
if(saveCode.equalsIgnoreCase(inputCode)) {
//判断验证码是否过期
if(saveDate != null && System.currentTimeMillis()- saveDate.getTime() < session_valid_timeout) {
return true;
}
}
return false;
}
}
6.1.6 调整前端页面代码
在 index.html中, 补充ajax代码, 点击提交按钮, 发送请求去服务端进行校验.
java
$("#checkCaptcha").click(function () {
$.ajax({
url: "captcha/check",
type: "post",
data: {
inputCode: $("#inputCaptcha").val()
},
success:function(result) {
if(result==true) {
location.href="success.html";
}else {
alert("验证码错误或者过期");
}
}
});
});
6.1.7 运行测试
通过 URL http://127.0.0.1:8080/index.html 访问服务

输入验证码

本篇博客到这里就结束啦, 感谢观看 ❤❤❤
🐎期待与你的下一次相遇😊😊😊