java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > JavaEE SpringBoot配置文件

JavaEE之SpringBoot配置文件的使用及说明

作者:苏小瀚

本文主要介绍了Spring Boot中配置文件的使用,包括application.properties和application.yml两种格式的配置文件的语法、读取方式以及优缺点,同时,还通过一个验证码案例练习,展示了如何使用Spring Boot和hutool工具类包实现验证码功能

1. 配置文件的作用

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

2. 配置文件的格式

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

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

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

3. properties配置文件介绍

3.1 properties语法

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

spring.application.name=spring-ioc-demo
#配置项目端口号
server.port=8090

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

key=1

3.2 读取配置文件

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

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

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

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

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

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

3.3. properties的缺点

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之间通过 英文冒号 + 空格 分开,然后设置配置文件,不同单词之间会换行:

server:
  port: 8080
key: 1

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

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

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

# 字符串
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配置文件里面的代码:

name: zhangsan
age: 12
@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还可以设置对象:

person:
  id: 1
  name: zhangsan
  age: 20

Person类:

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

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

使用该类:

通过@Autowied注解注入person对象

@ResponseBody
@Controller
public class ymlController {
    @Autowired
    private Person person;

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

4.5 配置集合

yml配置代码:

#集合
dbtypes:
  name:
    - hello1
    - hello2
    - hello3

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

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

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

@ResponseBody
@Controller
public class ymlController {
    @Autowired
    private DbTypes dbTypes;

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

4.6 配置Map

map的配置文件:

#Map
dbtypes:
  ball:
    k1: v1
    k2: v2
    k3: v3

使用Map类型来接收:

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

最后成功注入:

@ResponseBody
@Controller
public class ymlController {
    @Autowired
    private DbTypes dbTypes;

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

4.7 yml的优缺点

优点:

缺点:

5. 验证码案例练习

5.1 需求

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

5.2 hutool工具介绍

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

官网如下:官网

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

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

5.3 接口定义

生成验证码:

检验验证码:

5.4 后端代码实现

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

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管理,如果内部类是非静态的,创建就依赖于外部类,此时外部类对象还没有创建,无法创建内部类对象。

@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;
    }
}

配置文件里面的内容:

captcha:
  width: 150
  height: 50
  session:
    key: CAPTCHA_SESSION_KEY
    date: CAPTCHA_SESSION_DATE

5.5. 前端代码实现

index.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页面:

<!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>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文