Spring Boot 配置文件

文章目录

  • 一、什么是配置文件
  • [二、Spring Boot 配置文件](#二、Spring Boot 配置文件)
    • [2.1 概念](#2.1 概念)
    • [2.2 配置文件的格式](#2.2 配置文件的格式)
  • [三、properties 配置文件说明](#三、properties 配置文件说明)
    • [3.1 properties 基本语法](#3.1 properties 基本语法)
    • [3.2 读取配置文件](#3.2 读取配置文件)
    • [3.3 properties 缺点分析](#3.3 properties 缺点分析)
  • [四、 yml 配置文件说明](#四、 yml 配置文件说明)
    • [4.1 yml 基本语法](#4.1 yml 基本语法)
    • [4.2 yml 的使用](#4.2 yml 的使用)
    • [4.3 关于单双引号](#4.3 关于单双引号)
    • [4.4 yml 优缺点](#4.4 yml 优缺点)
  • 五、验证码案例

一、什么是配置文件

配置文件主要是为了解决硬编码带来的问题, 把可能会发生改变的信息, 放在⼀个集中的地方,当我们启动某个程序时, 应用程序从配置文件中读取数据, 并加载运行

硬编码是将数据直接嵌入到程序或其他可执⾏对象的源代码中, 也就是我们常说的"代码写死"

二、Spring Boot 配置文件

2.1 概念

SpringBoot支持并定义了配置文件的格式,也在另⼀个层面达到了规范其他框架集成到SpringBoot的目的

很多项目或者框架的配置信息也放在配置文件中,比如:

  1. 项目的启动端口
    • SpringBoot内置了Tomcat服务器, 默认端口号是8080。但是该端口号可能被占用,所以就需要程序员自定义端口号
  2. 数据库的连接信息(包含用户名和密码的设置)
  3. 第三方系统的调用密钥等信息
  4. 用于发现和定位问题的普通日志和异常日志等

2.2 配置文件的格式

Spring Boot 支持三种格式:properties、yml、yaml,但是只支持下面三种配置文件:

Spring Boot 配置文件有以下三种:

  1. application.properties
  2. application.yml
  3. application.yaml

yml 为yaml的简写, 实际开发中出现频率最高,yaml 和yml 的使用方式⼀样。

  • 当应用程序启动时, Spring Boot会自动从classpath路径找到并加载application.properties 和 application.yaml 或者 application.yml 文件
  • 也可以通过spring.config.name指定文件路径和名称

三、properties 配置文件说明

properties 配置⽂件是最早期的配置⽂件格式,也是创建 SpringBoot 项目默认的配置文件

3.1 properties 基本语法

properties 是以键值的形式配置的,key 和 value 之间是以"="连接的,如:

java 复制代码
# 配置项⽬端⼝号
server.port=8080
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&
spring.datasource.username=root
spring.datasource.password=root

3.2 读取配置文件

@Value 注解使用" ${} "的格式读取

java 复制代码
mykey.key1 = bite    #properties 配置
java 复制代码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PropertiesController {
	@Value("${mykey.key1}")
	private String key1;
	
	@RequestMapping("/key")
	public String key(){
		return "读取到值:"+key1;
	}
}

3.3 properties 缺点分析

是以 key-value 的形式配置的,会有很多冗杂的信息。yml格式则很好地避免了这个问题。

四、 yml 配置文件说明

4.1 yml 基本语法

yml 是树形结构的配置文件,它的基础语法是"key: value"。

key 和 value 之间使用英文冒号加空格的方式组成,空格不可省略

4.2 yml 的使用

1. 使用yml连接数据库

使用 @Value 来读取

java 复制代码
# 使用yml连接数据库
spring:
	datasource:
	url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
	username: root
	password: root

2. yml 配置不同数据类型及 null

使用 @Value 来读取

java 复制代码
# 字符串
string.value: Hello

# 布尔值,true或false
boolean.value: true
boolean.value1: false

# 整数
int.value: 10

# 浮点数
float.value: 3.14159

# Null,~代表null
null.value: ~

# "" 空字符串
#, 直接后⾯什么都不加就可以了, 但这种⽅式不直观, 更多的表⽰是使⽤引号括起来
empty.value: ''

3. 配置对象

用 @ConfigurationProperties 来读取

java 复制代码
# 第一种写法
student:
	id: 1
	name: Java
	age: 18

# 第二种写法(行内写法)
student: {id: 1,name: Java,age: 18}
java 复制代码
@RestController
public class StudentController {
	@Autowired
	private Student student;
	
	@RequestMapping("/readStudent")
	public String readStudent(){
		return student.toString();
	}
}
java 复制代码
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
    private int id;
    private String name;
    private int age;
}
java 复制代码
student:
  id: 1
  name: Java
  age: 18

4. 配置集合

用 @ConfigurationProperties 来读取

java 复制代码
dbtypes:
	name:
		- mysql
		- sqlserver
		- db2
java 复制代码
@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
	private List<String> name;
}
java 复制代码
@RestController
public class ReadYml2 {
	@Autowired
	private ListConfig listConfig;
	
	@RequestMapping("/readList")
	public String readList(){
		return listConfig.toString();
	}
}

5. 配置Map

用 @ConfigurationProperties 来读取

java 复制代码
maptypes:
	map:
		k1: kk1
		k2: kk2
		k3: kk3

 maptypes: {map: {k1: kk1,k2: kk2, k3: kk3}}
java 复制代码
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
	private HashMap<String,String> map;
}
java 复制代码
@RestController
public class ReadYml2 {
	@Autowired
	private MapConfig mapConfig;
	
	@RequestMapping("/readMap")
	public String readStudent(){
		return mapConfig.toString();
	}
}

4.3 关于单双引号

  • 字符串默认不用加上单引号或者双引号
    • 单引号会转义特殊字符,使其失去特殊功能, 始终是⼀个普通的字符串
    • 双引号不会转义字符串里面的特殊字符, 特殊字符会表示本身的含义

4.4 yml 优缺点

  • 优点
    • 可读性高,写法简单, 易于理解
    • 支持更多的数据类型, 可以简单表达对象, 数组,List,Map等数据形态
    • 支持更多的编程语言, 不止是Java中可以使用,在Golang, Python, Ruby, JavaScript中也可以使用
  • 缺点
    • 不适合写复杂的配置文件
    • 对格式有较强的要求(忘记空格检查会很麻烦)

五、验证码案例

(1)Kaptcha 插件介绍

Kaptcha 是Google的⼀个高度可配置的实用验证码生成工具

  1. 原理

    验证码可以客户端生成,也可以服务器生成。 对于普通的字符验证码,后端通常分两部分

    • 是生成验证码内容, 根据验证码内容和干扰项等, 生成图片, 返回给客户端
    • 是把验证码内容存储起来, 校验时取出来进行对比

    kaptcha插件选择把验证码存储在Session里

  2. 引入依赖

java 复制代码
<dependency>
	<groupId>com.oopsguy.kaptcha</groupId>
	<artifactId>kaptcha-spring-boot-starter</artifactId>
 	version>1.0.0-beta-2</version>
</dependency>
  1. 生成验证码
    • 代码生成
    • 通过配置文件生成

后端代码

java 复制代码
package com.bite.demo.controller;

import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.Date;

@RequestMapping("/admin")
@RestController
public class CaptchaController {
    //企业标准(建议):
    //常量定义: key: 全部大写, 单词之间使用下划线分割  value: 通常是小写, 以下划线分割
    private static final String KAPTCHA_SESSION_KEY = "HOME_KAPTCHA_SESSION_KEY";
    private static final String KAPTCHA_SESSION_DATE = "HOME_KAPTCHA_SESSION_DATE";
    //验证码的有效时间:ms
    private static final Long SESSION_TIMEOUT = 60 * 1000L;
    //验证成功: true
    //验证失败: false

    /**
     *  1. 从Session中获取到生成的验证码
     *  2. 比对前端传递的验证码和Session中存储的是否一样
     */
    @RequestMapping("/check")
    public Boolean check(String captcha, HttpSession session){

        if (!StringUtils.hasLength(captcha)){
            return false;
        }
        //从Session中获取验证码
        String saveCaptcha = (String)session.getAttribute(KAPTCHA_SESSION_KEY);
        Date saveDate = (Date)session.getAttribute(KAPTCHA_SESSION_DATE);
        //比对验证码
        if (captcha.equals(saveCaptcha)){
            //比对日期
            if (saveDate==null || System.currentTimeMillis() - saveDate.getTime()<SESSION_TIMEOUT){
                return true;
            }
        }
        return false;
    }
}

前端代码

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">

  <title>验证码</title>
  <style>
    #inputCaptcha {
      height: 30px;
      vertical-align: middle;
    }

    #verificationCodeImg {
      vertical-align: middle;
    }

    #checkCaptcha {
      height: 40px;
      width: 100px;
    }
  </style>
</head>

<body>
  <h1>输入验证码</h1>
  <div id="confirm">
    <input type="text" name="inputCaptcha" id="inputCaptcha">
    <img id="verificationCodeImg" src="/admin/captcha" style="cursor: pointer;" title="看不清?换一张" />
    <input type="button" value="提交" id="checkCaptcha">
  </div>
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
  <script>
    $(function () {
      $("#verificationCodeImg").click(function () {
        $(this).hide().attr('src', '/admin/captcha?dt=' + new Date().getTime()).fadeIn();
        // $(this).attr('src', '/admin/captcha?dt=' + new Date().getTime());
      });

      $("#checkCaptcha").click(function () {
        $.ajax({
          type: "get",
          url: "/admin/check",
          data: {
            captcha: $("#inputCaptcha").val()
          },
          success: function (result) {
            if (result) {
              location.href = "success.html";
              // location.assign("success.html");
            } else {
              alert("验证码错误");
            }
          }
        });
      });
    });


  </script>
</body>

</html>
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>验证成功页</title>
</head>
<body>
    <h1>验证成功</h1>
</body>
</html>
相关推荐
小灰灰要减肥12 分钟前
装饰者模式
java
张铁铁是个小胖子24 分钟前
MyBatis学习
java·学习·mybatis
0zxm35 分钟前
06 - Django 视图view
网络·后端·python·django
m0_7482571835 分钟前
Spring Boot FileUpLoad and Interceptor(文件上传和拦截器,Web入门知识)
前端·spring boot·后端
Yan.love1 小时前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶1 小时前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥1 小时前
java提高正则处理效率
java·开发语言
小_太_阳2 小时前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
智慧老师2 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm2 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23