[JavaEE] SpringBoot 配置文件

目录

[1. 配置文件的作用](#1. 配置文件的作用)

[2. 配置文件的格式](#2. 配置文件的格式)

[3. properties配置文件介绍](#3. properties配置文件介绍)

[3.1 properties语法](#3.1 properties语法)

[3.2 读取配置文件](#3.2 读取配置文件)

[3.3. properties的缺点](#3.3. properties的缺点)

[4. yml配置文件介绍](#4. yml配置文件介绍)

[4.1 yml语法](#4.1 yml语法)

[4.2 使用yml配置不同的数据类型](#4.2 使用yml配置不同的数据类型)

[4.3 yml配置的读取(使用到初始化注解@PostConstruct)](#4.3 yml配置的读取(使用到初始化注解@PostConstruct))

[4.4 配置对象(@ConfigurationProperties注解)](#4.4 配置对象(@ConfigurationProperties注解))

[4.5 配置集合](#4.5 配置集合)

[4.6 配置Map](#4.6 配置Map)

[4.7 yml的优缺点](#4.7 yml的优缺点)

[5. 验证码案例练习](#5. 验证码案例练习)

[5.1 需求](#5.1 需求)

[5.2 hutool工具介绍](#5.2 hutool工具介绍)

[5.3 接口定义](#5.3 接口定义)

[5.4 后端代码实现](#5.4 后端代码实现)

[5.5. 前端代码实现](#5.5. 前端代码实现)


1. 配置文件的作用

我们在使用Spring Boot框架时候,内置了Tomcat,启动端口号为8080,如果该端口号被占用,此时就可以在配置文件中设置指定端口号,配置文件里面也可以设置数据库的连接信息等内容。

2. 配置文件的格式

Spring Boot提供了三种配置文件的格式:

application.properties

application.yaml

application.yml

这里的yml是yaml的缩写,我们一般使用yml后缀的配置文件,这两种配置文件的语法一样。

如果一个项目同时存在properties和yml两种配置文件,如果配置信息冲突会以properties配置文件的信息为主。

3. properties配置文件介绍

3.1 properties语法

该配置文件里面的信息都是以 键值对的形式存在的,中间使用=连接,如果要注释,使用#,每个单词需要小写,并且每个单词之间使用 . 来分割。

java 复制代码
spring.application.name=spring-ioc-demo
#配置项目端口号
server.port=8090

我们还可以自定义配置,自己起一个建名,对应一个值。

java 复制代码
key=1

3.2 读取配置文件

我们可以在Java代码中读取配置文件中的内容,我们需要使用@Value注解,然后搭配${}使用来获取配置信息:

java 复制代码
@RequestMapping("/proper")
@ResponseBody
@Controller
public class propertiesController {
    @Value("${key}")
    private String key;

    @RequestMapping("/read")
    public String getValue() {
        return "获取配置信息" + key;
    }
}

如果我们想要直接在控制台看到结果,我们可以使用@PostConstruct注解,这是一个初始化注解,就是在初始化时候,执行该注解的方法。

java 复制代码
@RequestMapping("/proper")
@ResponseBody
@Controller
public class propertiesController {
    @Value("${key}")
    private String key;

    @PostConstruct
    public void getValue1() {
        System.out.println("获取配置信息: " + key);
    }
}

3.3. properties的缺点

java 复制代码
spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password

这是数据库的配置信息,我们可以发现通过properties的语法来写的配置信息会有很多冗余的内容,此时就可以使用yml配置文件来解决这个问题。

4. yml配置文件介绍

4.1 yml语法

yml的语法是:key和value之间通过 英文冒号 + 空格 分开,然后设置配置文件,不同单词之间会换行:

java 复制代码
server:
  port: 8080
key: 1

比如上面的数据库配置文件在yml里面的格式就是:

java 复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC
    username: name
    password: password

4.2 使用yml配置不同的数据类型

java 复制代码
# 字符串
string:
  value: hello
# 布尔值
boolean:
  value: true
# 整数
int:
  value: 11
# 浮点数
float:
  value: 3.1415
# null ~表示null
null2:
  value: ~
# 空字符串 可以使用'' 或者 ""
empty:
  value: ''

4.3 yml配置的读取(使用到初始化注解@PostConstruct)

yml的读取跟properties一样都是使用@Value注解来读取的·。

yml配置文件里面的代码:

java 复制代码
name: zhangsan
age: 12
java 复制代码
@ResponseBody
@Controller
public class ymlController {
    @Value("${name}")
    private String name;
    @Value("${age}")
    private int age;

    @PostConstruct
    public void getYml() {
        System.out.println("name=" + name + ", age=" + age);
    }
}

4.4 配置对象(@ConfigurationProperties注解)

yml还可以设置对象:

java 复制代码
person:
  id: 1
  name: zhangsan
  age: 20

Person类:

通过@ConfigurationProerties注解来将配置文件里面的对象属性放到该类对应的属性中,并使用@Configuration注解将该类交给容器管理,

java 复制代码
@ConfigurationProperties(prefix = "person")
@Configuration
@Data
public class Person {
    private int id;
    private String name;
    private int age;
}

使用该类:

通过@Autowied注解注入person对象

java 复制代码
@ResponseBody
@Controller
public class ymlController {
    @Autowired
    private Person person;

    @PostConstruct
    public void getYml() {
        System.out.println("person: " + person);
    }
}

4.5 配置集合

yml配置代码:

java 复制代码
#集合
dbtypes:
  name:
    - hello1
    - hello2
    - hello3

这里创建一个类,包含集合属性来接受。

java 复制代码
@ConfigurationProperties(prefix = "dbtypes")
@Configuration
@Data
public class DbTypes {
    private List<String> name;
}

最后可以成功的使用该对象:

java 复制代码
@ResponseBody
@Controller
public class ymlController {
    @Autowired
    private DbTypes dbTypes;

    @PostConstruct
    public void getYml() {
        System.out.println("dbTypes: " + dbTypes);
    }
}

4.6 配置Map

map的配置文件:

java 复制代码
#Map
dbtypes:
  ball:
    k1: v1
    k2: v2
    k3: v3

使用Map类型来接收:

java 复制代码
@ConfigurationProperties(prefix = "dbtypes")
@Configuration
@Data
public class DbTypes {
    private Map<String, String> ball;
}

最后成功注入:

java 复制代码
@ResponseBody
@Controller
public class ymlController {
    @Autowired
    private DbTypes dbTypes;

    @PostConstruct
    public void getYml() {
        System.out.println("dbTypes: " + dbTypes);
    }
}

4.7 yml的优缺点

优点:

可读性好,写法简单,容易理解。可以适用于多种编程语言。可以表示更多的数据类型,比如:对象,集合,Map等类型。

缺点:

对于一些比较复杂的配置文件,编写也比较困难,需要注意格式,可读性也会差点。

对格式要求很严格。

5. 验证码案例练习

5.1 需求

需要我们输入验证码,然后点击提交,验证码匹配就跳转到新页面,不正确就弹窗。

5.2 hutool工具介绍

在我们实现验证码功能之前,先介绍一个Java开发工具类包,这里面包含了很多的工具类,通过静态方法实现,也包含生成验证码的工具类,官网如下:

官网

我们就可以使用它提供的方法来生成验证码,之类需要引入依赖,在官方文档中有,我们使用下面的就行。

生成验证码的类包含很多方法:

5.3 接口定义

生成验证码:

请求:/captcha/getCaptcha

响应:验证码的图片内容

检验验证码:

请求:/captcha/check

请求参数:captcha= 用户输入的验证码

响应:true或者false

5.4 后端代码实现

生成验证码接口和判断验证码是否正确的接口代码:

java 复制代码
package com.sias.captcha.controller;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ShearCaptcha;
import com.sias.captcha.model.CaptchaProperties;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.IOException;
import java.util.Date;

@RequestMapping("/captcha")
@Controller
@ResponseBody
public class CaptchaController {

    @Autowired
    private CaptchaProperties captchaProperties;

    //定义过期时间(1分钟)
    private static final Long VALID_TIME = 60 * 1000L;

    @RequestMapping("/getCaptcha")
    public void getCaptcha(HttpServletResponse response, HttpSession session) {
        //设置响应数据类型
        response.setContentType("image/jpeg");
        try {
            //生成验证码
            //定义图形验证码的长、宽、验证码字符数、干扰线宽度
            ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight(), 4, 4);
            String code = captcha.getCode();
            session.setAttribute(captchaProperties.getSession().getKey(), code);
            session.setAttribute(captchaProperties.getSession().getDate(), new Date());
            //将验证码图片放到响应中
            captcha.write(response.getOutputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @RequestMapping("/check")
    public boolean check(String captcha, HttpSession session) {
        //判断验证码是否为空
        if(!StringUtils.hasLength(captcha)) {
            return false;
        }
        String code = (String)session.getAttribute(captchaProperties.getSession().getKey());
        Date date = (Date)session.getAttribute(captchaProperties.getSession().getDate());

        if(captcha.equalsIgnoreCase(code) && date != null &&
                System.currentTimeMillis() - date.getTime() < VALID_TIME) {
            return true;
        }
        return false;
    }
}

这里使用了配置文件来设置一些数据,比如,验证码框的长和宽,验证码的内容和生成验证码的时间存在session里面的key名字。这里我们就需要创建一个类来管理这些属性。

**注意:**这里的内部类要使用静态的,因为我们把CaptchaProrerties类交给Spring管理,如果内部类是非静态的,创建就依赖于外部类,此时外部类对象还没有创建,无法创建内部类对象。

java 复制代码
@ConfigurationProperties(prefix = "captcha")
@Configuration
@Data
public class CaptchaProperties {
    private Integer width;
    private Integer height;
    private Session session;

    @Data
    public static class Session {
        private String key;
        private String date;
    }
}

配置文件里面的内容:

java 复制代码
captcha:
  width: 150
  height: 50
  session:
    key: CAPTCHA_SESSION_KEY
    date: CAPTCHA_SESSION_DATE

5.5. 前端代码实现

index.html页面:

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

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

  <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
  <meta http-equiv="Pragma" content="no-cache" />
  <meta http-equiv="Expires" content="0" />

  <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="/captcha/getCaptcha" 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>
    
    $("#verificationCodeImg").click(function(){
      $(this).hide().attr('src', '/captcha/getCaptcha?dt=' + new Date().getTime()).fadeIn();
    });

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

  </script>
</body>

</html>

success.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>
相关推荐
Bug.ink1 分钟前
BUUCTF——WEB(6)
数据库·sql·网络安全·靶场·buuctf
2301_800256118 分钟前
E/R 图(实体 - 联系图)转换为关系模式(数据库表结构)的核心规则
数据库·oracle
合方圆~小文10 分钟前
工业摄像头工作原理与核心特性
数据库·人工智能·模块测试
jmxwzy15 分钟前
Redis
数据库·redis·缓存
零叹18 分钟前
Redis热Key——大厂是怎么解决的
数据库·redis·缓存·热key
王五周八19 分钟前
基于 Redis+Redisson 实现分布式高可用编码生成器
数据库·redis·分布式
win x21 分钟前
Redis事务
数据库·redis·缓存
飞翔的小->子>弹->22 分钟前
CMK、CEK
服务器·数据库·oracle
peixiuhui27 分钟前
Iotgateway技术手册-7. 数据库设计
数据库·iotgateway·开源dotnet·arm工控板·开源网关软件·开源数据采集
indexsunny29 分钟前
互联网大厂Java面试实战:基于电商场景的Spring Boot与微服务技术问答
java·spring boot·微服务·面试·hibernate·电商场景·技术问答