❣博主主页: 33的博客❣
▶️文章专栏分类:JavaEE◀️
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你了解更多进阶知识
目录
1.前言
计算机上有数以千计的配置⽂件,我们使⽤的绝⼤多数软件,如浏览器,微信,Idea, 甚至电脑,⼿机,都离不开配置⽂件.我们可能永远不会直接与其中的⼤部分⽂件打交道,但它们确实以不同的形式散落在我们的计算机上,例如C:\Users,C:\Windows⽂件夹,以及各种*.config,*.xml⽂件配置⽂件主要是为了解决硬编码带来的问题,把可能会发⽣改变的信息,放在⼀个集中的地方,当我们启动某个程序时,应用程序从配置⽂件中读取数据,并加载运行,那么接下来我们就学习SpringBoot配置文件。
2.配置文件快速入手
其实在之前我们已经接触过配置文件了,当启动服务器端口冲突的时候,我们就可以通过配置文件解决,只需要把配置文件中的端口号换成其他端口号即可。
修改application.properties文件
server.port=9090
3.配置文件格式
SpringBoot配置文件有三种格式
- application.properties
- application.yml
- application.yaml
yml是yaml的简写,在实际开发中使用频率较高。当程序启动时,SpringBoot会自动从resources路径中,找到 application.properties、application.yml或者 application.yaml的文件进行加载。
注意
.properties与.yml可以同时存在,当并存时,两个配置都会加载,如果配置文件有冲突,会以 .properties为主。
4.properties
4.1基本语法
properties 是以键值的形式配置的,key和value之间是以"="连接的,如:
配置端口号:
server.port=8080
4.2读取配置文件
可以使⽤@Value 注解使⽤" ${} "的格式读取,如下代码所示:
//配置文件中
mykey.key1 = book
//其他类中
@Value("${mykey.key1}")
private String key1;
4.3缺点分析
properties 配置是以key-value的形式配置的,会有许多冗余信息:
如果要解决信息的冗余就可以使用yml配置⽂件。
5.yml配置文件
5.1基本语法
基础语法是:“key:value”.
key和value之间必须使用英文冒号+空格!!!
5.2配置读取
//配置文件
string:
hello: book
//其他类
@Value("${string.hello}")
private String hello;
字符串默认不⽤加上单引号或者双引号。
单引号会转义特殊字符,使其失去特殊功能,始终是⼀个普通的字符串.
双引号不会转义字符串⾥⾯的特殊字符,特殊字符会表⽰本⾝的含义
string:
str1: Hello \n Spring Boot.
str2: 'Hello \n Spring Boot.'
str3: "Hello \n Spring Boot."
5.3配置对象
student:
id: 1
name: Java
age: 18
如果配置的是一个对象,那么久不能使用⽤@Value来读取,应该使用@ConfigurationProperties
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
private int id;
private String name;
private int age;
}
5.4配置集合
//配置文件
dbtypes:
name:
- mysql
- sqlserver
- db2
//其他类
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
private List<String> name;
}
5.5配置Map
//配置文件
maptypes:
map:
k1: kk1
k2: kk2
k3: kk3
//其他类
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
private HashMap<String,String> map;
}
5.6yml优缺点
优点:
1.可读性⾼,写法简单, 易于理解
2.⽀持更多的数据类型,可以简单表达对象,数组,List,Map等数据形态
缺点:
1.不适合写复杂的配置文件
2. 对格式有较强的要求
6.验证码案例
博主使用的是Hutool工具库其中包含了图片验证码,只需要引入对应的依赖即可。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.26</version>
</dependency>
配置文件
spring:
application:
name: captcha
captcha:
width: 200
height: 100
session:
key: "captcha_session_key"
date: "captcha_session_date"
captcha类
package com.example.captcha.model;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties("captcha")
@Component
@Data
public class Captcha {
private Integer width;
private Integer height;
private Session session;
@Data
public static class Session{
private String key;
private String date;
}
}
CaptchaController类
package com.example.captcha.Controller;
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import com.example.captcha.model.Captcha;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
@RequestMapping("captcha")
@RestController
public class CaptchaController {
private final static long session_volid_timeout=60*1000;
@Autowired
private Captcha captcha;
@RequestMapping("/get")
public void getCaptcha(HttpSession session,HttpServletResponse response){
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captcha.getWidth(), captcha.getHeight());
try {
lineCaptcha.write(response.getOutputStream());
session.setAttribute(captcha.getSession().getKey(),lineCaptcha.getCode());
session.setAttribute(captcha.getSession().getDate(),System.currentTimeMillis());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@RequestMapping("/check")
public Boolean checkCaptcha(String inputCode,HttpSession session){
if(!StringUtils.hasLength(inputCode)){
return false;
}
String key=(String) session.getAttribute(captcha.getSession().getKey());
long date=(long)session.getAttribute(captcha.getSession().getDate());
if(inputCode.equals(key)&&key!=null&&System.currentTimeMillis()-date< session_volid_timeout){
return true;
}
return false;
}
}
7.总结
properties 是以key=value的形式配置的键值类型的配置⽂件,yml使⽤的是树形配置⽅式.读取配置⽂件内容,使用@Value 注解,注解内使⽤"${} “的格式读取. yml层级之间使⽤换⾏缩进的⽅式配置,key和value之间使⽤”:"(英⽂冒号)加空格的⽅式设置,并且空格不可省略. properties 为早期并且默认的配置⽂件格式,其配置存在⼀定的冗余数据,使⽤yml可以很好的解决数据冗余的问题,但不适合复杂配置.
下期预告:SpringBoot日志