Spring配置文件
1.配置文件的作用
我们的计算机上存储了成千上万的配置文件,我们使用的应用都离不开配置文件.
配置文件主要是为了解决"硬编码"的问题,把可能会发生改变的信息,放在一个集中的地方,当我们启动一个程序的时候,应用程序就会从配置文件中读取这些数据,并加载运行.
小知识:
硬编码:硬编码就是将数据直接嵌入到程序或者其他的可执行文件的源代码中,也就是我们常说的"代码写死".比如手机字体大小,直接在我们的程序中固定字体大小,所有的用户都是同一个字体大小.但是用户可能有不同的喜好,我们可以把手机字体大小放在配置文件中华,当程序启动时,读取配置.以用户设置的大小来显示
2.Spring配置文件
上面红色的框中就是我们Spring Boot的配置文件
2.1配置文件的格式
Spring Boot的配置文件分为三种
application.properties
application.yml
application.yaml
其中appliation.yml是application.ymal的简写形式,他们是一个东西.但是我们一般都用application.yml.

2.1.1properties的配置文件说明
数据格式
spring.application.name=demo11
server.port=9090
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&
spring.datasource.username=root
spring.datasource.password=root
2.2.2读取配置文件
spring.application.name=demo11
server.port=9090
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&
spring.datasource.username=root
spring.datasource.password=root
mykey.key=souty
这里我们使用@Value注解.来将配置文件中的数据读取到程序中,括号中包括'$'符号,以及配置文件中的类型.
2.2.3properties缺点分析
spring.application.name=demo11
server.port=9090
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&
spring.datasource.username=root
spring.datasource.password=root
mykey.key=souty
这里我们看到properties的可读性不是很高.
3.yml的配置文件说明
yml是yaml的缩写
3.1yml的基本语法
它的基础语法"key: value".
key和value的之间使用英文冒号加空格的方式组成,空格不能省略.
基础语法格式如下:
spring:
application:
name: captcha-demo2
captchas:
width: 200
height: 80
session:
key: "captcha_session_key"
time: "captcha_session_time"
3.2yml的使用
mytypes:
type: post
注意:数据的格式,空格冒号缺一不可.
3.3value值的单双引号
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
@Value("${string.str1}")
private String str1;
@Value("${string.str2}")
private String str2;
@Value("${string.str3}")
private String str3;
@RequestMapping("/getStr")
public void priStr(){
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
}
上述结果我们可以看出:
字符串默认不用加上单引号或者双引号.
单引号会转义特殊字符,使其失去特殊功能
双引号不会转义字符
3.4配置对象
student:
id: 111
name: zhangsan
age: 20
我们要定义一个对象来接收数据,这里我们使用另外一个注解@ConfigurationProperties,并在括号中指明key.
3.5配置集合
定义一个集合用来接收数据,使用@ConfigurationProperties注解将数据放入集合中,并在括号内指明key
@Component
@ConfigurationProperties("dbtypes")
@Data
public class Configtype {
private List<String> name;
}
3.6yml的优缺点
优点:
可读性高,写法简单,易于理解
支持更多的参数类型,如对象,数组,List等
支持更多的编程语言
缺点:不适合写复杂的配置文件
4.验证码案例
首先我们要使用Hutools来帮助我们实现一个验证码.
引入依赖
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.34</version>
</dependency>
代码展示:
package com.example.demo.controller;
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
@RestController
@RequestMapping("/res")
public class CaptchaController {
private final static long VAILD_CAPTCHA_TIMEOUT=60*1000;
//1.首先我们要设置一个二维码并且返回给前端
@RequestMapping("/get")
public void getCap(HttpServletResponse response, HttpSession session) throws IOException {
//生成验证码
LineCaptcha captcha= CaptchaUtil.createLineCaptcha(200,80);
//将验证码返回给前端
captcha.write(response.getOutputStream());
//如果多个用户同时输入验证码,可能无法校验,这里我们使用学过的session,通过session来存储用户的验证码
String code = captcha.getCode();
session.setAttribute("captcha_session_key",code);
session.setAttribute("captcha_session_time",System.currentTimeMillis());
}
//2.校验
@RequestMapping("/check")
public Boolean check(String inputcode,HttpSession session){
//将session结果拿出来和用户输入的进行比对
//我们知道二维码也是有时间限制的,所以我们这里也要设置时间限制
//如何设置呢?就用通过session存储二维码的时间开始计算到当前时间,不超过某个阈值即可
String saveCode = (String) session.getAttribute("captcha_session_key");
long savetime = (long) session.getAttribute("captcha_session_time");
//当用户输入为空直接返回
if (inputcode==null){
return false;
}
//比对+判断是否是在时间之内
if (System.currentTimeMillis()-savetime<VAILD_CAPTCHA_TIMEOUT){
if(saveCode.equalsIgnoreCase(inputcode)){
return true;
}
}
return false;
}
}
代码优化:将一些不变的量放入配置文件中
captcha:
width: 200
height: 80
VAILD_CAPTCHA_TIMEOUT: 600000
session:
key: "captcha_session_key"
time: "captcha_session_time"
package com.example.demo.controller;
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import com.example.demo.model.CaptchaPractices;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
@RestController
@RequestMapping("/res")
public class CaptchaController {
@Autowired
private CaptchaPractices captchaPractices;
//1.首先我们要设置一个二维码并且返回给前端
@RequestMapping("/get")
public void getCap(HttpServletResponse response, HttpSession session) throws IOException {
//生成验证码
LineCaptcha captcha= CaptchaUtil.createLineCaptcha(captchaPractices.getWidth(),captchaPractices.getHeight());
//将验证码返回给前端
captcha.write(response.getOutputStream());
//如果多个用户同时输入验证码,可能无法校验,这里我们使用学过的session,通过session来存储用户的验证码
String code = captcha.getCode();
session.setAttribute(captchaPractices.getSession().getKey(),code);
session.setAttribute(captchaPractices.getSession().getTime(),System.currentTimeMillis());
//关闭outputStream
response.getOutputStream().close();
}
//2.校验
@RequestMapping("/check")
public Boolean check(String inputcode,HttpSession session){
//将session结果拿出来和用户输入的进行比对
//我们知道二维码也是有时间限制的,所以我们这里也要设置时间限制
//如何设置呢?就用通过session存储二维码的时间开始计算到当前时间,不超过某个阈值即可
String saveCode = (String) session.getAttribute(captchaPractices.getSession().getKey());
long savetime = (long) session.getAttribute(captchaPractices.getSession().getTime());
//当用户输入为空直接返回
if (inputcode==null){
return false;
}
//比对+判断是否是在时间之内
if (System.currentTimeMillis()-savetime<captchaPractices.getVAILD_CAPTCHA_TIMEOUT(){
if(saveCode.equalsIgnoreCase(inputcode)){
return true;
}
}
return false;
}
}