当前位置: 首页 > article >正文

Spring配置文件

1.配置文件的作用

我们的计算机上存储了成千上万的配置文件,我们使用的应用都离不开配置文件.

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

小知识:

硬编码:硬编码就是将数据直接嵌入到程序或者其他的可执行文件的源代码中,也就是我们常说的"代码写死".比如手机字体大小,直接在我们的程序中固定字体大小,所有的用户都是同一个字体大小.但是用户可能有不同的喜好,我们可以把手机字体大小放在配置文件中华,当程序启动时,读取配置.以用户设置的大小来显示

2.Spring配置文件

SpringBoot⽀持并定义了配置⽂件的格式, 也在另⼀个层⾯达到了规范其他框架集成到SpringBoot的⽬的.
很多项⽬或者框架的配置信息也放在配置⽂件中, ⽐如:
项⽬的启动端⼝
数据库的连接信息(包含⽤⼾名和密码的设置)
第三⽅系统的调⽤密钥等信息
⽤于发现和定位问题的普通⽇志和异常⽇志等.

上面红色的框中就是我们Spring Boot的配置文件

2.1配置文件的格式

Spring Boot的配置文件分为三种

application.properties

application.yml

application.yaml

其中appliation.yml是application.ymal的简写形式,他们是一个东西.但是我们一般都用application.yml.

当应⽤程序启动时, Spring Boot会⾃动从classpath路径找到并加载 .application.properties 和 application.yaml 或者 application.yml ⽂件.
他们两者其实都是配置文件,只是yml类似于properties的升级版,表示数据的格式发生了变化.
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;
    }
}


http://www.kler.cn/a/570018.html

相关文章:

  • iPhone 镜像 连接错误
  • 2024 ChatGPT大模型技术场景与商业应用视频精讲合集(45课).zip
  • 51单片机课综合项目
  • 京准电钟:NTP校时服务器于安防监控系统应用方案
  • K8S学习之基础五:k8s中node节点亲和性
  • 创建者——建造者模式
  • 直流减速电机控制实验:实验介绍
  • 机器学习数学通关指南
  • AI赋能企业协作4-NL2Sql技术路线
  • 【uniapp】离线打包uniapp为apk详细步骤
  • 碰一碰矩阵发视频源码:从 NFC 触发到 AI 矩阵剪辑
  • Excel文件中物件PPT文档如何保存到本地
  • MindIE 长文本推理
  • pat甲级1002 A+B for Polynomials
  • netty 与 websocket
  • JavaScript阻塞
  • eMMC存储器详解(存储区域结构、EXT_CSD[179]、各分区介绍、主要引脚、命令格式与类型等)
  • 百度权重有什么用?如何查看百度权重?
  • 在Vscode开发QT,完成QT环境的配置
  • SQLyog 13.1.6 社区免费中文版:高效便捷的MySQL管理工具